设计模式之创建型模式: 抽象工厂模式

一、基本思想

工厂方法模式引入工厂等级结构,解决了简单工厂模式中工厂类职责过重的问题,但由于工厂方法模式中每个工厂只创建一类具体类的对象,这将会导致系统当中的工厂类过多,这势必会增加系统的开销。此时,我们可以考虑将一些相关的具体类组成一个“具体类族”,由同一个工厂来统一生产,这就是我们本文要说的“抽象工厂模式”的基本思想。

 

简单工厂模式: 一个工厂生产所有产品     #例如:一个工厂既生产键盘,又生产鼠标
工厂模式:   一个工厂生产一个产品     #例如:键盘工厂只生产键盘,鼠标工厂生产鼠标
抽象工厂模式: 一个工厂生产相关的产品    #例如:电脑工厂不止生产键盘,还生产鼠标

 

二、具体实现:以组装因特尔电脑为例

第一步:创建抽象类工厂,工厂可以生产CPU和主板

class AbstractFactory(object):
    computer_name = ''

    def createCpu(self):
        pass

    def createMainboard(self):
        pass

第二步:创建抽象类产品:CPU和主板

class AbstractCpu(object):
    series_name = ''
    instructions = ''
    arch = ''
class AbstractMainboard(object):
    series_name = ''

第三步:创建具体类产品:因特尔的CPU和因特尔的主板

class IntelCpu(AbstractCpu):
    def __init__(self, series):
        self.series_name = series
class IntelMainBoard(AbstractMainboard):
    def __init__(self, series):
        self.series_name = series

第四步:创建具体类工厂:因特尔工厂

class IntelFactory(AbstractFactory):
    computer_name = 'Intel I7-series computer '

    def createCpu(self):
        return IntelCpu('I7-6500')

    def createMainboard(self):
        return IntelMainBoard('Intel-6000')

第五步:创建工程师抽象类,拥有获取硬件,组装电脑的技能

class ComputerEngineer(object):

    def makeComputer(self, factory_obj):
        self.prepareHardwares(factory_obj)  # 获取硬件
        info = '''
------- computer [%s] info:
cpu: %s mainboard: %s
-------- End --------
''' % (factory_obj.computer_name, self.cpu.series_name, self.mainboard.series_name)  # 完成组装 print(info)   def prepareHardwares(self, factory_obj): self.cpu = factory_obj.createCpu()         # 获取xxx品牌的CPU self.mainboard = factory_obj.createMainboard()  # 获取XXX品牌的主板

 

完整实现功能:工程师组装一台因特尔电脑

if __name__ == "__main__":
    engineer = ComputerEngineer()      # 创建一个工程师

    intel_factory = IntelFactory()      # 创建一个因特尔工厂
    engineer.makeComputer(intel_factory)  # 工程师组装因特尔厂的电脑

 

输出结果:

------- computer [Intel I7-series computer ] info:
cpu: I7
-6500 mainboard: Intel-6000
-------- End --------

 

三、抽象工厂模式的优缺点和使用场景


 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

posted @ 2021-06-02 23:53  麟灬  阅读(34)  评论(0)    收藏  举报