美文网首页
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

相关文章

  • 【重温设计模式】工厂设计模式

    一.介绍 工厂设计模式的分类 1.简单工厂模式2.工厂方法模式3.抽象工厂模式 工厂设计模式在工作中的应用 1.s...

  • 2.工厂设计模式

    1.什么是工厂设计模式 工厂--负责创建其他类型对象的类,工厂类有一个对象以及与它关联的多个方法。客户端使用某些参...

  • 工厂模式

    本章内容 1. 简单工厂模式(也叫静态工厂模式),2.工厂方法模式,3.抽象工厂模式特别建议大家可以敲下设计模式的...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • Java面试:谈谈Spring中使用的常用设计模式

    1. 设计模式概述 2. Spring中的设计模式 2.1 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • 项目开发-------iOS设计模式

    iOS的设计模式大体可以分为以下几种设计模式 1.创建型:单例设计模式、抽象工厂设计模式 2.结构型:MVC 模式...

  • Java 设计模式1-简单工厂模式

    简单工厂模式不属于标准的Java 23设计模式之内。根据分类,简单工厂模式又分类为:1.普通简单工厂模式。2.多方...

网友评论

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

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