1 概述
定义一个工厂类接口,让工厂子类来创建一系列相关或者相互依赖的对象
场景一:生产一辆汽车,需要发动机,变速箱,底盘,车厢,不同的车型有不同的发动机,不同的变速箱,不同的底盘和不同的车厢。
相比工厂方法模式,抽象工厂模式生产的是一套对象,工厂方法模式生产的是一个对象,可以给这一套对象加限制
角色
抽象工厂角色:造车工厂类,约束了一个工厂由几个对象创造而来
具体工厂角色:创造不同的车使用不同的具体工厂
抽象产品角色:抽象发动机类和抽象变速箱类
具体产品角色:具体发动机和具体变速箱
高层代码
2 代码实现
from abc import ABCMeta, abstractmethod
# 定义不同产品的抽象方法
class Motor(metaclass=ABCMeta):
"""
定义发动机类抽象方法
"""
@abstractmethod
def show_motor(self):
pass
class GearBox(metaclass=ABCMeta):
"""
定义变速箱类抽象方法
"""
@abstractmethod
def show_box(self):
pass
# 定义不同的产品
class MotorEA888(Motor):
def __init__(self, high_power=False):
self.high_power = high_power
def show_motor(self):
if self.high_power:
print("大众EA888高功率发动机")
print("大众EA888低功率发动机")
class MotorEA211(Motor):
def show_motor(self):
print("大众EA211发动机")
class MotorB50(Motor):
def show_motor(self):
print("宝马B50发动机")
class Box6AT(GearBox):
def show_box(self):
print("爱信6AT变速箱")
class Box8AT(GearBox):
def show_box(self):
print("采埃孚8AT变速箱")
class Box7DCT(GearBox):
def show_box(self):
print("DSG双离合变速箱")
# 定义抽象工厂类
class MakeCarFactory(metaclass=ABCMeta):
@abstractmethod
def make_motor(self):
pass
@abstractmethod
def make_box(self):
pass
# 定义具体工厂类
class MakePasste(MakeCarFactory):
def make_motor(self):
return MotorEA888()
def make_box(self):
return Box7DCT()
class MakeBMW525(MakeCarFactory):
def make_motor(self):
return MotorB50()
def make_box(self):
return Box8AT()
class MyCar:
def __init__(self,motor,box):
self.motor = motor
self.box = box
def show_car(self):
print(f"我的车主要配件:")
self.box.show_box()
self.motor.show_motor()
def create_my_car(makecarfactory):
motor = makecarfactory.make_motor()
box = makecarfactory.make_box()
mycar = MyCar(motor,box)
return mycar
if __name__ == '__main__':
mycar = create_my_car(MakeBMW525())
mycar.show_car()
"""
OUT:
我的车主要配件:
采埃孚8AT变速箱
宝马B50发动机
"""
3 优势&劣势
优势
所有的工厂模式都有客户端与具体的实现相分离
每个工厂创建了一个完整的产品系列,易于控制系列
有利于产品一致性,可定义产品之间的约束关系(比如宝马的发动机不能装在大众车上)
劣势
难以支持新种类的抽象产品
我们可以任意增加发动机的种类和变速箱的种类,但是不能添加抽象工厂类的方法。
比如造成的抽象类只是定义了一个发动机和一个变速箱,如果我还要增加一个底盘对象呢,这种情况就要修改工厂类的抽象方法,增加一个制作底盘的抽象方法,然后继承这个接口的所有类都要增加制作底盘这个方法。