工厂模式(简单、方法、抽象)
工厂模式就是减少new创建对象,创建复杂对象适合工厂模式
一、简单工厂模式
1. 抽象产品类
具体产品的基类,包含创建产品的公共方法(一般为纯虚函数)
2. 具体产品类
抽象产品类的派生类,包括具体产品特有的方法,是工厂的创建目标。
3. 工厂类
根据客户提供的产品ID创建具体的产品实例(new一个新的具体产品对象)
4. 缺点
违背了开闭原则(对扩展开放,对修改关闭),即在扩展功能时修改了既有的代码。
5. 适用场景
设计初期就确定后期不会新增具体产品。
二、工厂方法模式
和简单工厂模式不同的是工厂方法模式将实际创建工作推迟到子类当中。这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。如果程序设计初期就考虑到后期会增加具体产品可以使用。
1.工厂基类
提供创建产品基类
2.具体产品工厂子类
创建具体的产品
3.抽象产品基类
定义产品的公共方法
4.具体产品子类
具体产品的特有方法以及实现公共方法。
5.缺点
每一个产品都有一个工厂,增加了程序的复杂度。
6.适用场景
不确定产品的个数
三、抽象工厂模式
例如win和mac是工厂,mouse和keyboard产品族,有WinMouse和WinKeyboard还有MacMouse和MacKeyboard
1.抽象工厂基类
提供创建产品的工厂基类
2.具体创建一类产品(不是产品族)的工厂类(相当于Win和Mac)
继承自抽象工厂基类,可以创建多个产品,这些产品都继承自同一个产品族
3.产品基类(产品族,相当于Mouse和Keyboard)
一个产品族的产品,如果只有一个产品族,抽象工厂模式就相当于工厂方法模式
5.A工厂生产的产品,B工厂生产的产品的具体子类(相当于WinMouse和WinKeyboard还有MacMouse和MacKeyboard)
继承自产品基类(产品族),每个工厂都可以生产这些产品
6.优缺点
违背了开闭原则,新增产品麻烦。
总结:
简单工厂:一个工厂根据产品标识(参数)生产多个产品;
工厂方法:多个工厂生产对应的多个产品;
抽象工厂:多个工厂生产多个产品(一个工厂可以生产一类产品),进行方法组合;