美文网首页
深度解密Python工厂类相关模式

深度解密Python工厂类相关模式

作者: 云爬虫技术研究笔记 | 来源:发表于2019-03-25 22:51 被阅读0次
Python设计模式

相关代码已经上传至Github:Python_Development_Interview
,大家可以收藏专题-Python的设计模式:解密+实战,之后会持续更新相关的设计模式。

1. 认识工厂类相关模式

  • 认识工厂类相关模式
    • 1 工厂类相关模式含义
      工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”[1]
      创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中。创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分。工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题。由子类实现这个方法来创建具体类型的对象。
      对象创建中的有些过程包括决定创建哪个对象、管理对象的生命周期,以及管理特定对象的创建和销毁的概念。
    • 2 工厂类相关模式优点
      工厂模式、抽象工厂模式的优点:
      1、工厂模式巨有非常好的封装性,代码结构清晰;在抽象工厂模式中,其结构还可以随着需要进行更深或者更浅的抽象层级调整,非常灵活;
      2、屏蔽产品类,使产品的被使用业务场景和产品的功能细节可以分而开发进行,是比较典型的解耦框架。
    • 3 工厂类相关模式缺点
      工厂模式、抽象工厂模式的缺点:
      1、工厂模式相对于直接生成实例过程要复杂一些,所以,在小项目中,可以不使用工厂模式;
      2、抽象工厂模式中,产品类的扩展比较麻烦。毕竟,每一个工厂对应每一类产品,产品扩展,就意味着相应的抽象工厂也要扩展。
    • 4 工厂类相关模式应用
      工厂模式、抽象工厂模式的使用场景:
      1、当系统实例要求比较灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式实现。比如,
      在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么就可以对应建立对应层级的抽象工厂,根据不同的“产品需求”去生产定制的实例。

2. Python实现工厂类相关模式

Python实现工厂类相关模式

2.1 实例分析

工厂类相关的模式在Python里面没有特别的实现方法,我们就直接用案例来分析。

2.1.1 背景要求

假设我们现在需要开发一个快餐点餐系统,想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上,有三类可以选择的上餐品:汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后,订单就生成了。下面,我们用今天的主角--工厂模式--来生成这些食物的逻辑主体。

2.1.2 主餐的生成(仅以两种汉堡为例)

@dataclass
class Burger:
    name: str = ""
    price: float = 0.0

    def getPrice(self) -> float:
        return self.price

    def setPrice(self, price) -> NoReturn:
        self.price = price

    def getName(self) -> str:
        return self.name


@dataclass
class cheeseBurger(Burger):
    name = "cheese burger"
    price = 10.0


@dataclass
class spicyChickenBurger(Burger):
    name = "spicy chicken burger"
    price = 15.0

2.1.3 小食生成

@dataclass
class Snack:
    name: str = ""
    price: float = 0.0
    type: str = "SNACK"

    def getPrice(self) -> float:
        return self.price

    def setPrice(self, price) -> NoReturn:
        self.price = price

    def getName(self) -> str:
        return self.name


@dataclass
class chips(Snack):
    name = "chips"
    price = 6.0


@dataclass
class chickenWings(Snack):
    name = "chicken wings"
    price = 12.0

2.1.4 饮料生成

@dataclass
class Beverage:
    name: str = ""
    price: float = 0.0
    type: str = "BEVERAGE"

    def getPrice(self) -> float:
        return self.price

    def setPrice(self, price) -> NoReturn:
        self.price = price

    def getName(self) -> str:
        return self.name


@dataclass
class coke(Beverage):
    name = "coke"
    price = 4.0


@dataclass
class milk(Beverage):
    name = "milk"
    price = 5.0

2.1.5 实现工厂类

以上的BurgerSnackBeverage,都可以认为是该快餐店的产品,由于只提供了抽象方法,我们把它们叫抽象产品类,而cheese burger等6个由抽象产品类衍生出的子类,叫作具体产品类。
接下来,“工厂”就要出现了。

@dataclass
class foodFactory:
    type: str = ""

    def createFood(self, foodClass) -> ClassVar:
        print(self.type, " factory produce a instance.")
        foodIns = foodClass()
        return foodIns


@dataclass
class burgerFactory(foodFactory):
    type = "BURGER"


@dataclass
class snackFactory(foodFactory):
    type = "SNACK"


@dataclass
class beverageFactory(foodFactory):
    type = "BEVERAGE"

2.1.6 开始生产

同样,foodFactory为抽象的工厂类,而burgerFactorysnackFactorybeverageFactory为具体的工厂类。
在业务场景中,工厂模式是如何“生产”产品的呢?

if  __name__=="__main__":
    burger_factory=burgerFactory()
    snack_factorry=snackFactory()
    beverage_factory=beverageFactory()
    cheese_burger=burger_factory.createFood(cheeseBurger)
    print cheese_burger.getName(),cheese_burger.getPrice()
    chicken_wings=snack_factorry.createFood(chickenWings)
    print chicken_wings.getName(),chicken_wings.getPrice()
    coke_drink=beverage_factory.createFood(coke)
    print coke_drink.getName(),coke_drink.getPrice()
#output
BURGER  factory produce a instance.
cheese burger 10.0
SNACK  factory produce a instance.
chicken wings 12.0
BEVERAGE  factory produce a instance.
coke 4.0

3. 总结

总结

工厂模式也分为简单工厂模式和抽象工厂模式,像下面这样

class simpleFoodFactory:
    @classmethod
    def createFood(cls,foodClass):
        print "Simple factory produce a instance."
        foodIns = foodClass()
        return foodIns

在场景中写成如下形式:
spicy_chicken_burger=simpleFoodFactory.createFood(spicyChickenBurger)
这样,省去了将工厂实例化的过程。这种模式就叫做简单工厂模式。
还是在上述例子中,createFood方法中必须传入foodClass才可以指定生成的food实例种类,如果,将每一个细致的产品都建立对应的工厂(如cheeseBurger建立对应一个cheeseBurgerFactory),这样,生成食物时,foodClass也不必指定。事实上,此时,burgerFactory就是具体食物工厂的一层抽象。这种模式,就是抽象工厂模式。

相关文章

  • 深度解密Python工厂类相关模式

    相关代码已经上传至Github:Python_Development_Interview,大家可以收藏专题-Pyt...

  • *禁白嫖*python ----- 工厂模式

    禁白嫖 点赞 转发 适当打赏即可 ''' 1.python的工厂模式 1.1 工厂方法模式的定义 工厂函数、工厂类...

  • Effective Objective-C 2.0 第二章 九、

    类族模式也可叫做类簇模式。 在工厂模式中,有简单工厂模式,工厂方法模式,抽象工厂模式。而类族模式与简单工厂模式类似...

  • 8. 工厂方法模式

    8. 工厂方法模式 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类...

  • 工厂模式

    简单工厂模式 自行车类 工厂类 抽象工厂模式 自行车类 抽象工厂类 自行车工厂类

  • python设计模式 - 工厂模式之简单工厂

    python 环境 工厂模式简介 在面向对象中,“工厂”表示一个负责创建其他类型对象的类。客户端通过传参调用工厂类...

  • 简单工厂模式、工厂模式

    简单工厂模式类图 工厂方法模式类图 比较 简单工厂模式包含生成类实例的判断逻辑,工厂方法模式把判断...

  • 解密-工厂模式

    前言 相信每一个开发者每天都会 new 一些对象,当项目规模较小时,这显然是无伤大雅的,但随着项目的扩张,如果仍然...

  • 抽象工厂模式

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象...

  • 03.工厂方法模式(创建型)

    创建型模式-工厂方法模式 一、相关概念 工厂方法模式:定义一个用于创建对象的工厂接口,让子类决定将哪一个类实例化。...

网友评论

      本文标题:深度解密Python工厂类相关模式

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