ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

工厂模式之抽象工厂模式

2022-01-27 15:36:20  阅读:105  来源: 互联网

标签:__ self 披萨 模式 工厂 抽象 VegPizza class def


# 了解
抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象,而无需指定具体的类。工厂方法将创建实例的任务委托给了子类,而抽象方法的目的是创建一系列相关对象。
实际上,抽象工厂模式不仅确保客户端与对象的创建相互隔离,同时还确保客户端能够使用创建的对象。但是,客户端只能通过接口访问对象。如果要使用一个系列中的多个产品,那么抽象工厂模式能够帮助客户端一次使用来自一个产品/系列的多个对象。例如,如果正在开发的应用应该是平台无关的,则它需要对各种依赖项进行抽象处理,这些依赖项包括操作系统/文件系统调用,等等。抽象工厂模式负责为整个平台创建所需的服务,这样的话,客户端就不必直接创建平台对象了。


# 示例
假设我们开办了一家披萨店,供应美味的印式和美式披萨饼。为此,我们首先创建一个抽象基类---PizzsFactory(AbstractFactory),PizzaFactory类由两个抽象方法即createVegPizza()和createNonVegPizza(),他们需要通过ConcreteFactory实现。在这个例子中,我们创造了两个具体的工厂,分别为IndianPizzaFactory和USPizzaFactory.下面让我们看看这两个具体工厂的实现代码:
from abc import ABCMeta, abstractmethod

class PizzaFactory(metaclass=ABCMeta):
    @abstractmethod
    def createVegPizza(self):
        pass
    
    @abstractmethod
    def createNonVegPizza(self):
        pass
    
class IndianPizzaFactory(PizzaFactory):
    def createVegPizza(self):
        return DeluxVeggiePizza()
    
    def createNonVegPizza(self):
        return ChickenPizza()
    
class USPizzaFactory(PizzaFactory):
    def createVegPizza(self):
        return MexicanVegPizza()
    
    def createNonVegPizza(self):
        return HamPizza()
    
现在,我们进一步定义AbstractProducts.在下面的代码中,我们将创建两个抽象类:VegPizza和NonVegPizza(AbstractProduct和AnotherAbstractProduct)。它们都定义了自己的方法分别是prepare()和serve().
这里的想法是,素食披萨饼配有适当的外皮、蔬菜和调味料,非素食披萨饼在素食披萨饼上面搭配非素食食材。
然后我们为每个AbstractProducts定义ConcreteProducts。现在,就本例而言我们将创建DeluxVeggiePizza和MexicanVegPizza,并实现prepare()方法。ConcreteProducts1和ConcreteProduces2将代表UML图中的这些类。
接下来,我们来定义ChickenPizza和HamPizza,并实现server()方法---它们代表AnotherConcreteProducts1和AnotherConcreteProducts2:
    class VegPizza(metaclass=ABCMeta):
        @abstractmethod
        def prepare(self, VegPizza):
            pass
        
    class NonVegPizza(metaclass=ABCMeta):
        @abstractmethod
        def serve(self, VegPizza):
            pass
        
    class DeluxVeggiePizza(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__)
            
当最终用户来到PizzaStore并要一份美式非素食披萨的时候,USPizzaFactory负责准备素食,然后在上面加上火腿,马上就变成非素食披萨了
class PizzaStore:
    def __init__(self):
        pass
    def makePizzas(self):
        for factory in [IndianPizzaFactory(), USPizzaFactory()]:
            self.factory = factory
            self.NonVegPizza = self.factory.createNonVegPizza()
            self.VegPizza = self.factory.createVegPizza()
            self.VegPizza.prepare()
            self.NonVegPizza.serve(self.VegPizza)
pizza = PizzaStore()
pizza.makePizzas()

标签:__,self,披萨,模式,工厂,抽象,VegPizza,class,def
来源: https://www.cnblogs.com/weiweivip666/p/15849983.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有