# 用python实现工厂设计模式
先简单的介绍一下 工厂模式 的概念吧。
"""
定义:将对象/实例封装在工厂里面,封装了对象的细节。
功能:
工厂模式,顾名思义就是我们可以通过一个指定的“工厂”获得需要的“产品”,在设计模式中主要用于抽象对象的创建过程,让用户可以指定自己想要的对象而不必关心对象的实例化过程。
这样做的好处是用户只需通过固定的接口而不是直接去调用类的实例化方法来获得一个对象的实例,隐藏了实例创建过程的复杂度,解决了生产实例和使用实例的代码,降低了维护的复杂性。
"""
目录
简单工厂模式
注:我是跟着一个案例来的,他的思路很清晰,我一步一步跟着来,自己也能明白一点;
class Mercedes:
# 梅赛德斯
def __repr__(self):
return "Mercedes-Benz"
class BMW:
# 宝马
def __repr__(self):
return "BMW"
注:现在有两个品牌的汽车 ,但是没有工厂生产它们,我们只能自行生产,所以就得实例化:
mercedes = Mercedes()
bmw = BMW()
注:在现实生活中,可能根据不同的需要,相同品牌的不同车辆也可能构造不同,所以实例化就会产生弊端,我们可以建造一个工厂,根据自己的需求,来生产车辆,这时就可以构造一个“简单工厂”把所有汽车实例化的过程封装在里面。
class SimpleCarFactory:
# 简单工厂
def product_car(name):
if name == 'mb':
return Mercedes()
elif name == 'bmw':
return BMW()
注:有了 简单工厂 后,就可以通过向固定的接口传入参数获得想要的对象实例;
car1 = SimpleCarFactory.product_car('mb')
car2 = SimpleCarFactory.product_car("bmw")
案例源全部代码如下:
class Mercedes:
# 梅赛德斯
def __repr__(self):
return "Mercedes-Benz"
class BMW:
# 宝马
def __repr__(self):
return "BMW"
class SimpleCarFactory:
# 简单工厂
def product_car(name):
if name == 'mb':
return Mercedes()
elif name == 'bmw':
return BMW()
car1 = SimpleCarFactory.product_car('mb')
car2 = SimpleCarFactory.product_car("bmw")
print(car1)
print(car2)
结果:
Mercedes-Benz
BMW
工厂方式模式
"""
工厂方法模式继承了简单工厂模式的优点又有所改进,其不再通过一个工厂类来负责所有产品的创建,而是将具体创建工作交给相应的子类去做,
这使得工厂方法模式可以允许系统能够更高效的扩展。实际应用中可以用来实现系统的日志系统等,比如具体的程序运行日志,网络日志,数据库日志等都可以用具体的工厂类来创建。
"""
注:现在我们要生产的只有两种品牌的汽车,如果我们还要生产 Audi 品牌的车辆,首先我们要再加一个Audi的类,然后要在product_car里再加上一个Audi的名字,代码写起来麻烦又复杂,而且还违背了软件设计的开闭原则(学的新名词),所以我们可以换一种思路,尽量在增加新的类时,不改变原来的代码,所以我们可以把SimpleCarFactory抽象成不同的工厂,一个工厂生产一种产品;
import abc
class Mercedes:
# 梅赛德斯
def __repr__(self):
return "Mercedes-Benz"
class BMW:
# 宝马
def __repr__(self):
return "BMW"
class AbstractFactory:
# 抽象工厂
__metaclass__ = abc.ABCMeta
def product_car(self):
pass
class MercedesFactory(AbstractFactory):
# 梅赛德斯工厂
def product_car(self):
return Mercedes()
class BMWFactory(AbstractFactory):
# 宝马工厂
def product_car(self):
return BMW()
c1 = MercedesFactory().product_car()
c2 = BMWFactory().product_car()
print(c1)
print(c2)
注:简单介绍一下abc模块;
"""
在《抽象基类(ABC)》中,基于C++讲述抽象基类。尽管Python设计上以鸭子类型为主,但仍有抽象基类(ABC)的一席之地,它被封装在了abc模块中供程序员使用。
abc模块有以下两个主要功能:
某种情况下,判定某个对象的类型,如:isinstance(a, Sized)
强制子类必须实现某些方法,即ABC类的派生类
"""
结果:
Mercedes-Benz
BMW
抽象工厂模式
"""
抽象工厂模式在工厂方法基础上扩展了工厂对多个产品创建的支持,更适合一些大型系统,比如系统中有多于一个的产品族,
且这些产品族类的产品需实现同样的接口,像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。
"""
注:在生产大量汽车的时候,一个品牌我可能有生产不同的型号,工厂方法模式就要添加 更多类,也是比较麻烦的,所以我们就需要进一步抽象工厂类,一个工厂里可以生产一个品牌的不同型号,这就是抽象工厂;
import abc
# 两种小汽车
class Mercedes_C63:
"""梅赛德斯 C63
"""
def __repr__(self):
return "Mercedes-Benz: C63"
class BMW_M3:
"""宝马 M3
"""
def __repr__(self):
return "BMW: M3"
# 两种SUV
class Mercedes_G63:
"""梅赛德斯 G63
"""
def __repr__(self):
return "Mercedes-Benz: G63"
class BMW_X5:
"""宝马 X5
"""
def __repr__(self):
return "BMW: X5"
class AbstractFactory:
"""抽象工厂
可以生产小汽车外,还可以生产SUV
"""
__metaclass__ = abc.ABCMeta
def product_car(self):
pass
def product_suv(self):
pass
class MercedesFactory(AbstractFactory):
"""梅赛德斯工厂
"""
def product_car(self):
return Mercedes_C63()
def product_suv(self):
return Mercedes_G63()
class BMWFactory(AbstractFactory):
"""宝马工厂
"""
def product_car(self):
return BMW_M3()
def product_suv(self):
return BMW_X5()
c1 = MercedesFactory().product_car()
s1 = MercedesFactory().product_suv()
print(c1, s1)
s2 = BMWFactory().product_suv()
c2 = BMWFactory().product_car()
print(c2, s2)
结果:
Mercedes-Benz: C63 Mercedes-Benz: G63
BMW: M3 BMW: X5