抽象工厂设计模式适用于以下情况:
• 一个系统要独立于它的产品的创建、组合和表示;
• 一个系统要由多个产品系列中的一个来配置;
• 要强调一系列相关的产品对象的设计以便进行联合使用;
• 提供一个产品类库,但只想显示它们的接口而不是实现;
下面是一个抽象工厂模式的示例程序:
#include <iostream>
#include <memory>
#include <string>
// ==========================================
// 1. ABSTRACT PRODUCTS (Interfaces)
// ==========================================
class Button {
public:
virtual ~Button() = default;
virtual void paint() const = 0;
};
class Checkbox {
public:
virtual ~Checkbox() = default;
virtual void render() const = 0;
};
// ==========================================
// 2. CONCRETE PRODUCTS (Windows Variant)
// ==========================================
class WindowsButton : public Button {
public:
void paint() const override {
std::cout << "Rendering a Windows-style button.\\n";
}
};
class WindowsCheckbox : public Checkbox {
public:
void render() const override {
std::cout << "Rendering a Windows-style checkbox.\\n";
}
};
// ==========================================
// 3. CONCRETE PRODUCTS (Mac Variant)
// ==========================================
class MacButton : public Button {
public:
void paint() const override {
std::cout << "Rendering a Mac-style button.\\n";
}
};
class MacCheckbox : public Checkbox {
public:
void render() const override {
std::cout << "Rendering a Mac-style checkbox.\\n";
}
};
// ==========================================
// 4. ABSTRACT FACTORY
// ==========================================
class GUIFactory {
public:
virtual ~GUIFactory() = default;
virtual std::unique_ptr<Button> createButton() const = 0;
virtual std::unique_ptr<Checkbox> createCheckbox() const = 0;
};
// ==========================================
// 5. CONCRETE FACTORIES
// ==========================================
class WindowsFactory : public GUIFactory {
public:
std::unique_ptr<Button> createButton() const override {
return std::make_unique<WindowsButton>();
}
std::unique_ptr<Checkbox> createCheckbox() const override {
return std::make_unique<WindowsCheckbox>();
}
};
class MacFactory : public GUIFactory {
public:
std::unique_ptr<Button> createButton() const override {
return std::make_unique<MacButton>();
}
std::unique_ptr<Checkbox> createCheckbox() const override {
return std::make_unique<MacCheckbox>();
}
};
// ==========================================
// 6. CLIENT CODE
// ==========================================
// The client only interacts with the abstract factory and product interfaces.
void renderApplicationUI(const GUIFactory& factory) {
auto button = factory.createButton();
auto checkbox = factory.createCheckbox();
button->paint();
checkbox->render();
}
int main() {
std::cout << "— Initializing Windows Application —\\n";
WindowsFactory winFactory;
renderApplicationUI(winFactory);
std::cout << "\\n— Initializing Mac Application —\\n";
MacFactory macFactory;
renderApplicationUI(macFactory);
return 0;
}
程序运行结果如下:
$ g++ -o main main.cpp
$ ./main
— Initializing Windows Application —
Rendering a Windows-style button.
Rendering a Windows-style checkbox.
— Initializing Mac Application —
Rendering a Mac-style button.
Rendering a Mac-style checkbox.
网硕互联帮助中心






评论前必须登录!
注册