2.工厂设计模式

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.工厂设计模式)