专栏首页测试游记Python设计模式 - 工厂模式

Python设计模式 - 工厂模式

简单工厂模式

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

  • Cat
  • Dog
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

class ForestFactory(object):
    def make_sound(self, object_type):
        return eval(object_type)().do_say()

制造点声音

if __name__ == '__main__':
    ff = ForestFactory()
    animal = input("Which animal should make_sound?[Dog or Cat]")
    ff.make_sound(animal)

运行结果

类关系图

类关系图

工厂方法模式

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

内容抽象类`Section`

from abc import ABCMeta, abstractmethod


class Section(metaclass=ABCMeta):
    @abstractmethod
    def describe(self):
        pass

不同的内容

  • PersonalSection
  • AlbumSection
  • PatenSection
  • PublicationSection
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`

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
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())

选择一个社交网站

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

class PizzFactory(metaclass=ABCMeta):
    @abstractmethod
    def createVegPizza(self):
        pass

    @abstractmethod
    def createNonVegPizza(self):
        pass
  • IndianPizzaFactory
  • USPizzaFactory
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
class VegPizza(metaclass=ABCMeta):
    @abstractmethod
    def prepare(self):
        pass


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

四种不同的披萨

  • DeluxVeggiePizza
  • ChickenPizza
  • MexicanVegPizza
  • HamPizza
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__)

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

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

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)

测试

if __name__ == '__main__':
    pizza = PizzaStore()
    pizza.makePizzas()

测试结果

类关系图

类关系图

工厂方法和抽象工厂方法

工厂方法

抽象工厂方法

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

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

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

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

用于创建一个产品

用于创建相关产品的系列

本文分享自微信公众号 - 测试游记(zx94_11),作者:zx钟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 测试开发进阶(五)

    输入与次对象相关的运行时上下文。如果存在的话,with语句将绑定该方法的返回值到该语句的as子语句中指定的目标

    zx钟
  • Python设计模式-状态模式

    切换状态的时候会使用self.__class__将它动态切换到状态对应的对象,这个稍后再看。

    zx钟
  • 测试开发进阶(二十七)

    projects.serializer.ProjectModelSerializer中添加

    zx钟
  • Python之面向对象二

    面向对象的三大特性: 继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 pyt...

    新人小试
  • 多继承 , 组合 , 菱形继承 , 接口

    py3study
  • 学完Python基础知识后,你真的会python吗?

    前言 最近觉得 Python 太“简单了”,于是在师父川爷面前放肆了一把:“我觉得 Python 是世界上最简单的语言!”。于是川爷嘴角闪过了一丝轻蔑的微笑(内...

    CDA数据分析师
  • python 中的嵌套类

    能够看到 类中 又定义了 类 ,这种情况我们称之为嵌套类 。给一个简单 demo 来认识嵌套类 。

    py3study
  • Python中接口定义和依赖注入

    首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束

    py3study
  • 觉得 Python 太“简单了”,这些题你能答对几个?

    觉得 Python 太“简单了”?作为一个 Python 开发者,我必须要给你一点人生经验,不然你不知道天高地厚!)一份满分 100 分的题,这篇文章就是记录下...

    一墨编程学习
  • Python基础之(八)类

    当类中变量引用的是可变对象是,类属性和实例属性都能直接修改这个对象,从而影响另一方的值。

    py3study

扫码关注云+社区

领取腾讯云代金券