前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。java
同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,可是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不一样等级的一组产品称为一个产品族,图所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。python
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个建立一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能获得同族的不一样等级的产品的模式结构。spa
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式通常要知足如下条件。操作系统
抽象工厂模式除了具备工厂方法模式的优势外,其余主要优势以下。设计
其缺点是:当产品族中须要增长一个新的产品时,全部的工厂类都须要进行修改。code
抽象工厂模式同工厂方法模式同样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不一样,抽象产品的个数也不一样。如今咱们来分析其基本结构和实现方法。对象
抽象工厂模式的主要角色以下。blog
从上图能够看出抽象工厂模式的结构同工厂方法模式的结构类似,不一样的是其产品的种类不止一个,因此建立产品的方法也不止一个。下面给出抽象工厂和具体工厂的代码。接口
class AbstractFactory(object): def new_product1(self): pass def new_product2(self): pass class ConcreteFactory(AbstractFactory): def new_product1(self): print("具体工厂 1 生成-->具体产品 11...") return ConcreteProduct11() def new_product2(self): print("具体工厂 1 生成-->具体产品 21...") return ConcreteProduct21() class ConcreteProduct11(): pass class ConcreteProduct21(): pass
【例1】用抽象工厂模式设计农场类。
分析:农场中除了像畜牧场同样能够养动物,还能够培养植物,如养马、养牛、种菜、种水果等,因此本实例比前面介绍的畜牧场类复杂,必须用抽象工厂模式来实现。
本例用抽象工厂模式来设计两个农场,一个是韶关农场用于养牛和种菜,一个是上饶农场用于养马和种水果,能够在以上两个农场中定义一个生成动物的方法 newAnimal() 和一个培养植物的方法 newPlant()。产品
class Farm(object): def new_animal(self): pass def new_plant(self): pass class SRFarm(Farm): def new_animal(self): print("建立SrFarm的animal") return Horse() def new_plant(self): print("建立SrFarm的animal") return Potato() class SGFarm(Farm): def new_animal(self): print("建立SgFarm的animal") return Cattle() def new_plant(self): print("建立S给Farm的animal") return Tomato() class Animal(object): def show(self): pass class Horse(Animal): def show(self): print("i am an animal from SR -- horse") class Cattle(Animal): def show(self): print("i am an animal from SG -- cattle") class Plant(object): def show(self): pass class Potato(Plant): def show(self): print('i am a plant from SR -- potato') class Tomato(Plant): def show(self): print('i am a plant from SG -- tomato') if __name__ == '__main__': sg_f = SGFarm() sg_a = sg_f.new_animal() sg_a.show() sr_f = SRFarm() sr_p = sr_f.new_plant() sr_p.show()
建立SgFarm的animal i am an animal from SG -- cattle 建立SrFarm的animal i am a plant from SR -- potato
抽象工厂模式最先的应用是用于建立属于不一样操做系统的视窗构件。如 java 的 AWT 中的 Button 和 Text 等构件在 Windows 和 UNIX 中的本地实现是不一样的。
抽象工厂模式一般适用于如下场景:
抽象工厂模式的扩展有必定的“开闭原则”倾斜性:
另外一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。