在《设计模式》一书中工厂模式提到了:
工厂方法模式(Factory Method)
抽象工厂模式 (Abstract Factory)
但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
虚构造器(Virtual Constructor)
小李开了一个代工厂,专门帮各大厂商生产手机,一开始只有小米找他生产小米手机(MiPhone),后来质量过硬,声名远播,苹果公司也找上门了,准备让他生产苹果手机,生意来了,小李小手一挥,停工几个月,加了一个生产线专门生成苹果手机(Iphone)。于是乎,现在一个工厂有两个生产线。
让我们借助 UML 图直观了解一下工厂现在的样子。
通过代码去实现这个逻辑
from abc import ABC, abstractmethod # 手机 class Phone(ABC): @abstractmethod def make(self): pass # 苹果手机 class Apple(Phone): def make(self): print("make apple") # 小米手机 class XiaoMi(Phone): def make(self): print("make xiaomi") class Factory: def product_phone(self, mobile_type): if mobile_type == 'apple': return Apple() else: return XiaoMi() if __name__ == '__main__': factory = Factory() factory.product_phone('apple').make() factory.product_phone('xiaomi').make()看一下运行结果:
make apple make xiaomi 第二阶段随着第一阶段的订单完成,现在越来越多的手机厂商来找小李来生产手机,问题来了,生产线改造需要导致整个工厂停工一段时间,每次停工对工厂来说都是巨大的损失。那么该怎么解决问题呢?一个工厂似乎不够用了,那么该怎么解决呢? 把所有的生产线独立出来到单独的工厂,这样子需要生产新的手机只需要新增新的工厂就好了,不会影响其他的手机的生产。
同样让我们借助 UML 图了解一下这个阶段工厂的样子吧。
同样让我们借助代码去实现这一阶段的逻辑
from abc import ABC, abstractmethod # 抽象工厂 class AbastractFactory(ABC): @abstractmethod def product_phone(self): pass # 苹果工厂 class AppleFactory(AbastractFactory): def product_phone(self): return Apple().make() # 小米工厂 class XiaomiFactory(AbastractFactory): def product_phone(self): return XiaoMi().make() # 生产线 class Phone(ABC): @abstractmethod def make(self): pass # 苹果生产线 class Apple(Phone): def make(self): print("make apple") # 小米生产线 class XiaoMi(Phone): def make(self): print("make xiaomi") def client_product(factory:AbastractFactory): return factory if __name__ == '__main__': xiaomi = client_product(XiaomiFactory()) xiaomi.product_phone() apple = client_product(AppleFactory()) apple.product_phone()看一下运行结果:
make xiaomi make apple 总结