Python工厂模式二

抽象工厂模式

抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象,而无需指定具体的类。工厂方法将创建实例的任务委托给了子类,而抽象工厂方法的目标是创建一系列相关对象。

实现抽象工厂模式

想象一下,我们开办了一家披萨店,供应美味的印式和美式披萨。为此,我们首先创建一个抽象基类——PizzaFactory,PizzaFactory类有两个抽象方法,即create_vag_piza()和create_non_vag_pizza(),它们需要通过ConcreateFactory实现。在这个例子中,我们创造了两个具体的工厂,分别名为IndianPizzaFactory和USPizzaFactory。如下所示:

from abc import ABCMeta, abstractmethod


class PizzaFactory(object):
    @abstractmethod
    def create_vag_pizza(self):
        pass

    @abstractmethod
    def create_non_var_pizza(self):
        pass


class IndianPizzaFactory(PizzaFactory):
    def create_vag_pizza(self):
        return DeluxeVeggiePizza()

    def create_non_var_pizza(self):
        return ChickenPizza()


class USPizzaFactory(PizzaFactory):
    def create_vag_pizza(self):
        return MexicanVegPizza()

    def create_non_var_pizza(self):
        return HamPizza()


class VegPizza(metaclass=ABCMeta):
    @abstractmethod
    def prepare(self):
        pass


class NonVegPizza(metaclass=ABCMeta):
    @abstractmethod
    def serve(self, VegPizza):
        pass


class DeluxeVeggiePizza(VegPizza):
    def prepare(self):
        print("Prepare ", type(self).__name__)


class ChickenPizza(NonVegPizza):
    def serve(self, VegPizza):
        print(type(self).__name__, "is served with Chicken on", type(VegPizza).__name__)


class MexicanVegPizza(VegPizza):
    def prepare(self):
        print("Prepare ", type(self).__name__)


class HamPizza(NonVegPizza):
    def serve(self, VegPizza):
        print(type(self).__name__, "is served with Ham on", type(VegPizza).__name__)

上面的代码中,我们也进一步定义了AbstractProducts。我们创建了两个抽象类:VegPizza和NonVegPizza;它们都定义了自己的方法,分别是prepare()和serve()。

然后我们为每个AbstractProducts定义ConcreteProducts。就本例来说,我们创建了DeluxVeggiePizza和MexincanVegPizza,并实现prepare()方法。

我们还定义了ChickenPizza和HamPizza,并实现了serve()方法

当最终的用户来到PizzaStore并且要一份美式非素食披萨的时候,USPizzaFactory负责准备素食,然后在上面加上火腿,马上就变成非素食的披萨了;代码如下:

class PizzaStore(object):
    def __init__(self):
        pass

    def make_pizzas(self):
        for factory in [IndianPizzaFactory(), USPizzaFactory()]:
            self.factory = factory
            self.NonVegPizza = self.factory.create_non_var_pizza()
            self.VegPizza = self.factory.create_vag_pizza()
            self.VegPizza.prepare()
            self.NonVegPizza.serve(self.VegPizza)


pizza = PizzaStore()
pizza.make_pizzas()

工厂方法与抽象工厂方法对比

工厂方法抽象工厂方法
它向客户方开放了一个创建对象的方法抽象工厂方法包含一个或多个工厂方法来创建一个系列的相关对象
它使用继承和子类来决定要创建那个对象它使用组合将创建对象的任务委托给其他类
工厂方法用于创建一个产品抽象工厂方法用于创建相关产的系列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值