6.设计模式之四:抽象工厂模式【建立型模式】

前面介绍的工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。java

同种类称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,可是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品,如农场里既养动物又种植物,电器厂既生产电视机又生产洗衣机或空调,大学既有软件专业又有生物专业等。
抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不一样等级的一组产品称为一个产品族,图所示的是海尔工厂和 TCL 工厂所生产的电视机与空调对应的关系图。python

定义与特色

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个建立一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能获得同族的不一样等级的产品的模式结构。spa

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式通常要知足如下条件。操作系统

  • 系统中有多个产品族,每一个具体工厂建立同一族但属于不一样等级结构的产品。
  • 系统一次只可能消费其中某一族产品,即同族的产品一块儿使用。

抽象工厂模式除了具备工厂方法模式的优势外,其余主要优势以下。设计

  • 能够在类的内部对产品族中相关联的多等级产品共同管理,而没必要专门引入多个新的类来进行管理。
  • 当增长一个新的产品族时不须要修改原代码,知足开闭原则。

其缺点是:当产品族中须要增长一个新的产品时,全部的工厂类都须要进行修改。code

结构与实现

抽象工厂模式同工厂方法模式同样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不一样,抽象产品的个数也不一样。如今咱们来分析其基本结构和实现方法。对象

1. 模式的结构

抽象工厂模式的主要角色以下。blog

  1. 抽象工厂(Abstract Factory):提供了建立产品的接口,它包含多个建立产品的方法 newProduct(),能够建立多个不一样等级的产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的建立。
  3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来建立,它 同具体工厂之间是多对一的关系。

 

2. 模式的实现

从上图能够看出抽象工厂模式的结构同工厂方法模式的结构类似,不一样的是其产品的种类不止一个,因此建立产品的方法也不止一个。下面给出抽象工厂和具体工厂的代码。接口

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 中的本地实现是不一样的。

抽象工厂模式一般适用于如下场景:

  1. 当须要建立的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  2. 系统中有多个产品族,但每次只使用其中的某一族产品。若有人只喜欢穿某一个品牌的衣服和鞋。
  3. 系统中提供了产品的类库,且全部产品的接口相同,客户端不依赖产品实例的建立细节和内部结构。

模式的扩展

抽象工厂模式的扩展有必定的“开闭原则”倾斜性:

  1. 当增长一个新的产品族时只需增长一个新的具体工厂,不须要修改原代码,知足开闭原则。
  2. 当产品族中须要增长一个新种类的产品时,则全部的工厂类都须要进行修改,不知足开闭原则。

另外一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。

相关文章
相关标签/搜索