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

简介: 认识工厂类相关模式认识工厂类相关模式1 工厂类相关模式含义工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。
  1. 认识工厂类相关模式
    认识工厂类相关模式

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

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

1 实例分析
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 实现工厂类
以上的Burger,Snack,Beverage,都可以认为是该快餐店的产品,由于只提供了抽象方法,我们把它们叫抽象产品类,而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为抽象的工厂类,而burgerFactory,snackFactory,beverageFactory为具体的工厂类。
在业务场景中,工厂模式是如何“生产”产品的呢?

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

  1. 总结
    总结

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

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就是具体食物工厂的一层抽象。这种模式,就是抽象工厂模式。

相关文章
|
1天前
|
设计模式 安全 API
探索Python中的异步编程模式
【9月更文挑战第19天】在本文中,我们将深入探讨Python的异步编程世界。通过理解其背后的原理和实践应用,你将学会如何编写更加高效、响应更快的程序。文章将引导你从基础概念出发,逐步过渡到高级用法,确保你能够自信地运用异步特性来优化你的代码。
|
12天前
|
Python Windows
Python交互模式
Python交互模式。
8 1
|
24天前
|
Python
12类常用的Python函数
12类常用的Python函数
|
21天前
|
存储 程序员 Python
Python类的定义_类和对象的关系_对象的内存模型
通过类的定义来创建对象,我们可以应用面向对象编程(OOP)的原则,例如封装、继承和多态,这些原则帮助程序员构建可复用的代码和模块化的系统。Python语言支持这样的OOP特性,使其成为强大而灵活的编程语言,适用于各种软件开发项目。
16 1
|
24天前
|
存储 程序员 C++
python类及其方法
python类及其方法
|
23天前
|
C++ Python
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
12 1
|
24天前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
1月前
|
对象存储 Python
Python代码解读-理解-定义一个User类的基本写法
以上描述清晰地阐述了如何在Python中定义 `User`类的基本方法以及如何创建和使用该类的实例。这是面向对象编程中的核心概念,是紧密结合抽象和实现,封装数据并提供操作数据的接口。由于用简单通用的语言易于理解,这样的解释对于初学者而言应该是友好且有帮助的。
22 4
|
24天前
|
存储 中间件 PHP
Python编程入门:从零到一的代码实践深入理解 PHP 中的中间件模式
【8月更文挑战第28天】本文旨在通过浅显易懂的方式,向初学者介绍Python编程的基础知识,并结合具体代码示例,带领读者一步步实现从零基础到能够独立编写简单程序的转变。文章将围绕Python语言的核心概念进行讲解,并通过实例展示如何应用这些概念解决实际问题。无论你是编程新手还是希望扩展技能的专业人士,这篇文章都将为你打开编程世界的大门。 【8月更文挑战第28天】在PHP的世界中,设计模式是构建可维护和可扩展软件的重要工具。本文将通过浅显易懂的语言和生动的比喻,带领读者深入理解中间件模式如何在PHP应用中发挥魔力,实现请求处理的高效管理。我们将一步步揭开中间件的神秘面纱,从它的定义、工作原理到
|
28天前
|
测试技术 Python
Python 类中__init__方法的作用
【8月更文挑战第24天】
30 0