<Python设计模式>-抽象工厂模式

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 优势&劣势

优势

所有的工厂模式都有客户端与具体的实现相分离

每个工厂创建了一个完整的产品系列,易于控制系列

有利于产品一致性,可定义产品之间的约束关系(比如宝马的发动机不能装在大众车上)

劣势

难以支持新种类的抽象产品

我们可以任意增加发动机的种类和变速箱的种类,但是不能添加抽象工厂类的方法。
比如造成的抽象类只是定义了一个发动机和一个变速箱,如果我还要增加一个底盘对象呢,这种情况就要修改工厂类的抽象方法,增加一个制作底盘的抽象方法,然后继承这个接口的所有类都要增加制作底盘这个方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kobe_OKOK_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值