刘刚刚的个人博客

HeadFirst 设计模式--抽象工厂

创建时间:2022-11-08 23:25:58
更新时间:2022-11-08 23:25:58

当想让产品类与制作产品的原料类集合起来时使用

抽象工厂模式

我们应尽量“要依赖抽象,不要依赖具体类(面向对象的设计原则)”,这又称为‘依赖导致原则’,可将业务类从繁多的类依赖中摆脱出来。

示例

书中通过pizza分店中处理不同风味披萨的例子,介绍了抽象工厂模式的使用。每个披萨的制作过程相同,但是原料不同,通过抽象工厂,为每个pizza店,产生不同的原料类。

from abc import abstractmethod, ABCMeta


class ThinCrustDough:
    pass


class MarinaraSauce:
    pass


class ReggianoCheese:
    pass


class PizzaIngredientFactory:
    """
    抽象类
    """
    pass


class NYPizzaIngredientFactory(PizzaIngredientFactory):

    def create_dough(self):
        return ThinCrustDough()

    def create_sauce(self):
        return MarinaraSauce()

    def create_Cheese(self):
        return ReggianoCheese()

    # 其他方法省略
    ...


class Pizza(ABCMeta):
    name = None
    dough = None
    sauce = None
    Cheese = None

    @abstractmethod
    def prepare(self):
        '''
        准备制作pizza的原料
        '''
        pass

    def bake(self):
        print("烘焙25-30分钟")

    def cut(self):
        print("切披萨")

    def box(self):
        print("包装")


class CheesePizza(Pizza):
    name = "奶酪pizza"
    ingredientFactory = None

    def __init__(self, ingredientFactory):
        self.ingredientFactory = ingredientFactory

    def prepare(self):
        print("正在制作" + self.name)
        self.dough = self.ingredientFactory.create_dough()
        self.sauce = self.ingredientFactory.create_sauce()
        self.Cheese = self.ingredientFactory.create_Cheese()


class PizzaStore:
    pizza = None

    def __init__(self, pizza_factory):
        self.pizza_factory = pizza_factory

    def create_pizza(self, pizza_type):
        pizza = None
        ingredientFactory = NYPizzaIngredientFactory()
        if pizza_type == "CheesePizza":
            pizza = CheesePizza(ingredientFactory)
        return pizza

    def order_pizza(self, pizza_type):
        pizza = self.create_pizza(pizza_type)
        pizza.prepare()
        pizza.bake()
        pizza.cut()
        pizza.box()
        return self.pizza

抽象工厂允许客户使用抽象接口创建一组相关的产品,而不需要知道具体的产品是什么,这样客户就从具体的产品中解耦.

工厂方法与抽象工厂的区别:

  1. 工厂方法使用的是继承,抽象工厂使用的是接口
  2. 工厂方法将依赖的类改为依赖某个产品类的抽象类型,而子类(子类依赖的时类,而非对象),在实例化时,再实例化某个具体产品的类.

    抽象工厂创建了一个产品原料的抽象、一组依赖该抽象的产品、一个业务类,要使用这个工厂,需要先实例化它的一个类(原料类),然后将其传入到业务类中,在业务类中,使用该原料类,来生产具体的产品。

  3. 使用场景:

    抽象工厂:当想让产品类与制作产品的原料类集合起来时使用。

    工厂模式:当想让将实例化具体类的代码从具体的类中解耦时使用。

我的名片

昵称:shuta

职业:后台开发(python、php)

邮箱:648949076@qq.com

站点信息

建站时间: 2020/2/19
网站程序: ANTD PRO VUE + TP6.0
晋ICP备18007778号