设计模式——抽象工厂方法(abstract factory)
目录
- 1. 引言
- 2. 实例
- 3. 核心思想总结
1. 引言
  如果要用一句话来形象地解释抽象工厂(Abstract Factory)模式,我们可以想象这样一个场景:
 你正在设计一款“小咪手机”,这款手机由多个部件组成,比如屏幕、摄像头、电池、芯片等。现在你需要决定这些零部件从哪里来。
   方案一:为每种零部件建立一个独立的工厂,再由总装车间统一组装。
   方案二:建立一个“大工厂”,它内部包含多个流水线,可以一次性生产属于同一品牌或风格的所有零部件。
   很明显,方案二更方便管理,也更容易保证整体兼容性。这个“大工厂”就是抽象工厂模式的核心思想——为一组相关或相互依赖的产品提供统一的创建接口。
  这里的“抽象”并不是指模糊,而是指隔离变化、隐藏具体实现。
   抽象工厂定义了一个“工厂接口”,它不关心每个具体工厂如何实现,而是通过这一层抽象,让我们可以在不修改客户端代码的前提下,方便地切换产品族(比如从“小咪品牌”切换到“大花品牌”)。
因此可以理解为:
- “抽象”意味着不依赖具体实现;
- “抽象”意味着可以自由切换同类产品族。
2. 实例
现在我们要创建一个界面,但是界面有多种不同的风格,并且每种风格都有多种相关的组件(widge)。这时候我们就可以创建相关抽象类(abstract)和具体类(concrete), 如下图。现在有两大类风格的多种组件。
- PM - PM-scrollBar
- PM-window
 
- Motlf - Motlf-scrollBar
- Motlf-window
 
每个组件的行为类似,我们为风格相同的组件创建具体的工厂,每个工厂的行为也是相似的,于是将其抽象化,这样我们就得到了一个统一的接口,所有的操作都可以传递,并且用户不需要知道具体的逻辑。
 
class ScrollBar {
public:virtual void Scroll() = 0;virtual ~ScrollBar() = default;
};class PMScrollBar : public ScrollBar {
public:void Scroll() override {std::cout << "PM style scrollbar scrolling..." << std::endl;}
};class WidgetFactory{
public:virtual ScrollBar* CreateScollBar() = 0;...
}class PMWidgetFactory : public WidgetFactory{
public:ScrollBar* CreateScollBar() override{return (ScrollBar*)new PMScrollBar();}...
}void create_product(WidgetFactory* factory){// 创建产品
}int main(){...WidgetFactory* factory = new PMWidgetFactory();create_product(factory);...
}
3. 核心思想总结
创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的具体类。
达到:
- 客户端只依赖于工厂接口;
- 不关心具体对象的创建细节;
- 可以在不修改客户端代码的前提下替换整个产品族。

| 角色 | 含义 | 
|---|---|
| AbstractFactory | 抽象工厂接口,声明创建抽象产品的方法 | 
| ConcreteFactory | 具体工厂,实现创建具体产品的方法 | 
| AbstractProduct | 抽象产品接口,定义产品的通用行为 | 
| ConcreteProduct | 具体产品,实现抽象产品接口 | 
| Client | 客户端,通过抽象工厂创建产品,只与抽象接口交互 | 
