简单工厂模式
所属分类
创建型模式
意图
定义方法或类一个可以批量生产不同的对象实例。
角色对象
工厂类角色(Factory):用于实现创建所有类的对象实例的内部逻辑,使用工厂类对象提供给外界调用,按指定的参数或其他规则传入,就可以返回所需的内部其他类的产品对象实例。它是实现简单工厂模式的核心关键。
产品(Product)抽象角色:工厂角色(Factory)内部需要创建的其他类的产品对象实例的抽象父类,负责描述需要工厂角色创建的所有对象相关公共属性和接口。【就是产品的抽象类】
具体产品(Concrete Product)角色:基于产品的抽象类所派生出来具体的产品类,是某个产品实现的具体类的对抽象类的实现的实例。它是实现简单工厂模式的中内部提供的具体的产品类对象实例。

适用场景
当一个类不知道它所必须创建的对象的类的时候 当一个类希望由它的子类来指定它所创建的对象的时候
实现方式:
#!/usr/bin/evn python
# coding=utf-8
from abc import ABCMeta,abstractmethod
# 供货商抽象类--------产品(Product)抽象角色
class Supplier(metaclass=ABCMeta):
# 定义抽象方法,卖出商品的方法,买家通过这个方法来获取对象
@abstractmethod
def make(self):
pass
# 供货商提供的商品具体化-----产品(Concrete Product)具体角
class Yan(Supplier):
def make(self):
print("商铺提供订单需求-开始生产盐")
return self
# 供货商提供的商品具体化-----产品(Concrete Product)具体角
class Bingjilin(Supplier):
def make(self):
print("商铺提供订单需求-生产冰激凌")
return self
# 供货商提供的商品具体化-----产品(Concrete Product)具体角
class ShiYan(Supplier):
def make(self):
print("商铺提供订单需求-生产食盐" )
return self
# 工厂类角色(Factory)
class FactoryShop:
def sell_product(self,objprodeuct=None,num=1,productname=None):
# print("卖出productname" + productname + "了num:" + str(num))
product = [eval(objprodeuct)().make() for i in range(0, num)]
print(product)
return "卖出productname" + productname + "了num:"+ str(len(product))
if __name__ == '__main__':
xiaozhongshop = FactoryShop()
# 开始有人光顾商店了,有人说要烟,冰激凌,食盐,我开始像供货商取货先---
print("***" * 20)
print(xiaozhongshop.sell_product('Yan',num=1,productname='烟'))
print("***"*20)
print(xiaozhongshop.sell_product('Bingjilin', num=2, productname='冰激凌'))
print("***" * 20)
print(xiaozhongshop.sell_product('ShiYan', num=2, productname='食盐'))
输出结果:
************************************************************
商铺提供订单需求-开始生产盐
[<__main__.Yan object at 0x00000207ED136B00>]
卖出productname烟了num:1
************************************************************
商铺提供订单需求-生产冰激凌
商铺提供订单需求-生产冰激凌
[<__main__.Bingjilin object at 0x00000207ED136B00>, <__main__.Bingjilin object at 0x00000207ED136B70>]
卖出productname冰激凌了num:2
************************************************************
商铺提供订单需求-生产食盐
商铺提供订单需求-生产食盐
[<__main__.ShiYan object at 0x00000207ED136B00>, <__main__.ShiYan object at 0x00000207ED136B38>]
卖出productname食盐了num:2
上面的代码中,商定作为工厂,提供给客户端产品,不管客户端(用户)需要什么,只需要客户端说需要什么的,我就向对应的供货商发订单,他们就开始生产对应的产品给我,然后商品再把商品给用户。用户其实不用关心我们的商铺有没有这个类。(当然没有的话,肯定是卖不出这个了!)
再看我们的FactoryShop,如果有新增的其他产品的其实都不需要再里面做新增产品,直接使用eval(objprodeuct)()就可以反转到具体的对象,然后进行对象实例化。
PS:关于
Python eval() 函数 它是Python 内置函数 作用:eval() 函数用来执行一个字符串表达式,并返回表达式的值。
优点:
对象的创建独立于类来创建。(委托给其他类来创建,委托里面其实也需要对象的类来实例化) 客户端不需要了解创建对象的类内部细节,只需按相关参数要求传递,即可返回相关类的对象的实例。 工程类可以扩展新增其他类,而客户端不需要更改,指需要按原来既定的参数传递就可以获取对象实例。
缺点:
单一职责原则: 定义:一个合理的类,应该仅有一个引起它变化的原因,即单一职责,就是设计的这个类功能应该只有一个。(功能粒度>的拆分,这个需要看业务和需求,也不是刻板的进行单一功能划分,导致划分粒度过细)
优点:优点:消除耦合,减小因需求变化引起代码僵化。
开-闭原则: 定义:设计要对扩展有好的支持,而对修改要严格限制。即对扩展开放,对修改封闭。
优点:降低了程序各部分之间的耦合性,其适应性、灵活性、稳定性都比较好。当已有软件系统需要增加新的功能时,>不需要对作为系统基础的抽象层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能。增加的新模块对>原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试。
违反单一职责的设计原则,工厂类集中管理了几个具体产品类的创建 扩展新产品时(如果不是使用eval函数的为) 违反高内聚责任分配原则
如使用:
def sell_product(num=1,productname=None):
# print("卖出productname" + productname + "了num:" + str(num))
if productname == '烟':
product = [Yan().make() for i in range(0, num)]
if productname == '冰激凌':
product = [Bingjilin().make() for i in range(0, num)]
if productname == '食盐':
product = [ShiYan().make() for i in range(0, num)]
else:
return "没有该产品提供"
return "卖出productname" + productname + "了num:"+ str(len(product))
可能每次新增新的产品都需要再内部添加具体的类的匹配创建,违反开闭设计原则(对扩展要支持,对修改要限制)
资料参考来源
https://blog.csdn.net/qdPython/article/details/108869599
个人其他博客地址
简书:https://www.jianshu.com/u/d6960089b087
掘金:https://juejin.cn/user/2963939079225608
小钟同学 | 文 【原创】| QQ:308711822
1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。




