本文讲解设计模式之抽象工厂模式。
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
这么说有的同学可能不理解:这与上篇文章讲的工厂模式有何异同呢?那么就对比看一下:
工厂模式针对的是一个抽象产品类,可以派生多个产品子类;而抽象工厂模式针对的是多个抽象产品类,可以派生多种产品子类;工厂模式和抽象工厂模式都具有一个抽象工厂类,可以派生出多个具体工厂类,区别是前者每个具体工厂类只能创建一个具体产品类的实例,而后者每个具体工厂类可以创建多个具体产品类的实例。下面的类图似乎能够更清晰的说明差异:
抽象工厂模式的角色和工厂角色的模式相同,只不过可以生产多种相关的或者相互依赖的产品。所以,可以将工厂模式看作抽象工厂模式的一个特例(即只能生产单一产品)。毕竟,抽象工厂模式比工厂模式更抽象了。
举例来说,上节讲到的苹果工厂规模扩大了,现不仅仅要生产苹果,还要生产加工产品,即苹果汁。同样,香蕉工厂也要生产加工产品,香蕉汁。苹果和香蕉有一个水果基类,而苹果汁和香蕉汁也有一个果汁基类。所以,苹果工厂和香蕉工厂不单纯的生产单一的产品,而是生产一组相关的或者依赖的产品。
Python代码设计如下:
抽象产品类:水果基类和果汁基类为
具体产品类:苹果类,香蕉类,苹果汁类,香蕉汁类为
抽象工厂类为:
具体工厂类:苹果工厂和香蕉工厂为:
有了上述工厂,客户端就可以应用快速的生产水果和果汁了:
抽象工厂模式是工厂模式的一个拓展,抽象工厂与工厂模式的最大区别就是:工厂方法模式针对的是一个产品等级结构;而抽象工厂则需要面对多个产品等级结构,抽象工厂可以使用同一工厂的等级结构来对付这些相同的或者极为类似的产品等级结构,这就是抽象工厂的好处。在增加产品族(比如新增加橙子工厂)的时候是支持开闭原则,而在增加新的产品等级结构(比如苹果工厂需要生产苹果罐头)就不支持开闭原则,这也是抽象工厂模式的一个缺点,设计时需要慎重考虑。
你领悟了新的设计模式抽象工厂模式了吗?它与工厂模式的区别是什么呢?欢迎留言吐槽拍砖。
参考:
(完)
看完本文有收获?请转发分享给更多人
关注「Python那些事」,做全栈开发工程师
领取专属 10元无门槛券
私享最新 技术干货