前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python设计模式 - 工厂模式

Python设计模式 - 工厂模式

作者头像
zx钟
发布2019-07-18 21:51:27
5170
发布2019-07-18 21:51:27
举报
文章被收录于专栏:测试游记测试游记

简单工厂模式

基于一个包含do_say()方法的Animal的抽象类创建两个类

  • Cat
  • Dog
代码语言:javascript
复制
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!!")

创建一个包含make_sound()方法的工厂类ForestFactory

代码语言:javascript
复制
class ForestFactory(object):
    def make_sound(self, object_type):
        return eval(object_type)().do_say()

制造点声音

代码语言:javascript
复制
if __name__ == '__main__':
    ff = ForestFactory()
    animal = input("Which animal should make_sound?[Dog or Cat]")
    ff.make_sound(animal)

运行结果

类关系图

类关系图

工厂方法模式

有两个社交网站LinkedIn和Facebook,它们的个人简介界面有各自不同的内容

内容抽象类`Section`
代码语言:javascript
复制
from abc import ABCMeta, abstractmethod


class Section(metaclass=ABCMeta):
    @abstractmethod
    def describe(self):
        pass
不同的内容
  • PersonalSection
  • AlbumSection
  • PatenSection
  • PublicationSection
代码语言:javascript
复制
class PersonalSection(Section):
    def describe(self):
        print("Personal Section")


class AlbumSection(Section):
    def describe(self):
        print("Album Section")


class PatenSection(Section):
    def describe(self):
        print("Patent Section")


class PublicationSection(Section):
    def describe(self):
        print("Publication Section")
公司抽象类`Profile`
代码语言:javascript
复制
class Profile(metaclass=ABCMeta):
    def __init__(self):
        self.sections = []
        self.createProfile()

    @abstractmethod
    def createProfile(self):
        pass

    def getSections(self):
        return self.sections

    def addSections(self, section):
        self.sections.append(section)
公司类
  • linkedin
  • facebook
代码语言:javascript
复制
class linkedin(Profile):
    def createProfile(self):
        self.addSections(PersonalSection())
        self.addSections(PatenSection())
        self.addSections(PublicationSection())


class facebook(Profile):
    def createProfile(self):
        self.addSections(PersonalSection())
        self.addSections(AlbumSection())

选择一个社交网站

代码语言:javascript
复制
if __name__ == '__main__':
    profile_type = input("Which Profile you`d like to create?[LinkedIn or FaceBook]")
    profile = eval(profile_type.lower())()
    print("Creating Profile..", type(profile).__name__)
    print("Profile has sections --", profile.getSections())

测试结果

类关系图

工厂方法模式

抽象工厂模式

一家提供印式和美式披萨的店(抽象类PizzFactory

代码语言:javascript
复制
class PizzFactory(metaclass=ABCMeta):
    @abstractmethod
    def createVegPizza(self):
        pass

    @abstractmethod
    def createNonVegPizza(self):
        pass
  • IndianPizzaFactory
  • USPizzaFactory
代码语言:javascript
复制
class IndianPizzaFactory(PizzFactory):
    def createVegPizza(self):
        return DeluxVeggiePizza()

    def createNonVegPizza(self):
        return ChickenPizza()


class USPizzaFactory(PizzFactory):
    def createVegPizza(self):
        return MexicanVegPizza()

    def createNonVegPizza(self):
        return HamPizza()

两种不同的披萨(抽象类)

  • 素食披萨NonVegPizza
  • 非素食披萨VegPizza
代码语言:javascript
复制
class VegPizza(metaclass=ABCMeta):
    @abstractmethod
    def prepare(self):
        pass


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

四种不同的披萨

  • DeluxVeggiePizza
  • ChickenPizza
  • MexicanVegPizza
  • HamPizza
代码语言:javascript
复制
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__)

到此就完成了一家披萨店,有两个国家口味,各有荤素的披萨。

整合为一个制造披萨的工厂

代码语言:javascript
复制
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)

测试

代码语言:javascript
复制
if __name__ == '__main__':
    pizza = PizzaStore()
    pizza.makePizzas()

测试结果

类关系图

类关系图

工厂方法和抽象工厂方法

工厂方法

抽象工厂方法

向客户端开发了一个创建对象的方法

包含一个或多个工厂方法来创建一个系列的相关对象

使用继承和子类来决定要创建哪个对象

使用组合将创建对象的任务委托给其他类

用于创建一个产品

用于创建相关产品的系列

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-14,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单工厂模式
    • 类关系图
      • 内容抽象类`Section`
      • 不同的内容
      • 公司抽象类`Profile`
      • 公司类
  • 工厂方法模式
    • 选择一个社交网站
      • 类关系图
      • 抽象工厂模式
        • 测试
          • 类关系图
          • 工厂方法和抽象工厂方法
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com