美文网首页
2.工厂设计模式

2.工厂设计模式

作者: 何学诚 | 来源:发表于2019-04-21 18:25 被阅读0次
    1.什么是工厂设计模式

    工厂--负责创建其他类型对象的类,工厂类有一个对象以及与它关联的多个方法。
    客户端使用某些参数调用此方法,工厂会根据某些属性创建这些对象,并返回给客户端。
    例如,客户去pizza店点pizza,这里的pizza店就是一个工厂,根据用户选择的属性创建一个完整的pizza,然后返回给客户。

    它的设计意图:
    • 松耦合,创建的对象可以独立于类实现
    • 客户端无需知道创建对象的类,但是可以使用接口创建对象。简化了客户端的实现。
    • 可以在工厂中添加其他类创建其他类型的对象,无需更改客户端代码
    • 复用性
    2.代码实现:

    这里给出多种实现方式:

    a.简单的工厂模式:
    客户端选择猫或者狗,来获得一个猫或狗的叫声。


    简单的工厂模式.JPG
    from abc import ABCMeta, abstractmethod
    
    class Animal(metaclass=ABCMeta):
        @abstractmethod
        def do_say(self):
            pass
    
    
    class Dog(Animal):
        def do_say(self):
            print("Bhow Bhow!")
    
    
    class Cat(Animal):
        def do_say(self):
            print("Meow Meow!")
    
    
    class ForestFactory(object):
        def make_sound(self, object_type):
            # eval(object_type)():<__main__.Cat object at 0x7fb8e7651518> 这是一个对象
            # eval 用来执行一个字符串表达式,并返回表达式的值
            return eval(object_type)().do_say()
    
    # client code
    if __name__ == '__main__':
        ff = ForestFactory()
        animal = input("Which animal should make_sound Dog or Cat?")
        ff.make_sound(animal)
    

    b.工厂方法模式:


    工厂方法模式.JPG
    # 基类
    class Section(metaclass=ABCMeta):
        @abstractmethod
        def describe(self):
            pass
    
    # 个人信息描述
    class PersonalSection(Section):
        def describe(self):
            print("Personal Section")
    
    # 个人相册
    class AlbumSection(Section):
        def describe(self):
            print("Album Section")
    
    # 专利
    class PatentSection(Section):
        def describe(self):
            print("Patent Section")
    
    # 发表物
    class PublicationSection(Section):
        def describe(self):
            print("Publication Section")
    
    # 个人信息基类--这里用于
    class Profile(metaclass=ABCMeta):
        def __init__(self):
            self.section = []
            self.createProfile()
    
        @abstractmethod
        def createProfile(self):
            pass
    
        def getSection(self):
            return self.section
    
        def addSection(self, section):
            self.section.append(section)
    
    # linkedin软件创建,添加专利、发表物
    class Linkedin(Profile):
        def createProfile(self):
            self.addSection(PersonalSection())
            self.addSection(PatentSection())
            self.addSection(PublicationSection())
    
    # facebook软件创建,添加个人信息,相册
    class facebook(Profile):
        def createProfile(self):
            self.addSection(PersonalSection())
            self.addSection(AlbumSection())
    
    
    if __name__ == "__main__":
        profile_type = input("Which Profile you'd like create Facebook or LinkedIN")
        profile = eval(profile_type.lower())  # 将输入变成小写
        # print(eval(profile_type.lower())())
        # p = facebook()
        # print(p)
        print("Create profile..", type(profile).__name__)
        print("Profile has section --", profile().getSection())
    

    c.抽象工厂方法实现单例:


    抽象工厂方法.JPG
    
    # 抽象基类--批萨工厂,包括两个抽象方法,制作蔬菜的和非蔬菜的.
    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()
    
    
    # 蔬菜批萨的基类
    class VegPizza(metaclass=ABCMeta):
        @abstractmethod
        def prepare(self):
            # 准备
            pass
    
    
    # 非蔬菜批萨的基类,蔬菜批萨+肉
    class NonVegPizza(metaclass=ABCMeta):
        @abstractmethod
        def serve(self, VegPizza):
            # 服务
            pass
    
    
    class DeluxVeggiePizza(VegPizza):
        def prepare(self):
            print("Perpare: ", 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("Perpare: ", type(self).__name__)
    
    
    class HamPizza(NonVegPizza):
        def serve(self, VegPizza):
            print(type(self).__name__, "is served with Chicken on",
                  type(VegPizza).__name__)
    
    
    class PizzaStore(object):
        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()
    
    4.源码:

    https://github.com/Wind0ranger/LeetcodeLearn/blob/master/0-DesignPatterns/2-FactoryTon.py

    相关文章

      网友评论

          本文标题:2.工厂设计模式

          本文链接:https://www.haomeiwen.com/subject/oqvjgqtx.html