浅析Python 简单工厂模式和工厂方法模式的优缺点


Posted in Python onJuly 13, 2020

前言

在《设计模式》一书中工厂模式提到了:

  • 工厂方法模式(Factory Method)
  • 抽象工厂模式 (Abstract Factory)

但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。

工厂意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

别名

虚构造器(Virtual Constructor)

案例

第一阶段

小李开了一个代工厂,专门帮各大厂商生产手机,一开始只有小米找他生产小米手机(MiPhone),后来质量过硬,声名远播,苹果公司也找上门了,准备让他生产苹果手机,生意来了,小李小手一挥,停工几个月,加了一个生产线专门生成苹果手机(Iphone)。于是乎,现在一个工厂有两个生产线。

第一阶段 UML 图

让我们借助 UML 图直观了解一下工厂现在的样子。

浅析Python 简单工厂模式和工厂方法模式的优缺点

第一阶段代码

通过代码去实现这个逻辑

from abc import ABC, abstractmethod

# 手机
class Phone(ABC):
 
 @abstractmethod
 def make(self):
 pass

# 苹果手机
class Apple(Phone):
 
 def make(self):
 print("make apple")

# 小米手机
class XiaoMi(Phone):
 
 def make(self):
 print("make xiaomi")


class Factory:

 def product_phone(self, mobile_type):
 if mobile_type == 'apple':
  return Apple()
 else:
  return XiaoMi()


if __name__ == '__main__':
 factory = Factory()
 factory.product_phone('apple').make()
 factory.product_phone('xiaomi').make()

看一下运行结果:

make apple
make xiaomi

第二阶段

随着第一阶段的订单完成,现在越来越多的手机厂商来找小李来生产手机,问题来了,生产线改造需要导致整个工厂停工一段时间,每次停工对工厂来说都是巨大的损失。那么该怎么解决问题呢?一个工厂似乎不够用了,那么该怎么解决呢? 把所有的生产线独立出来到单独的工厂,这样子需要生产新的手机只需要新增新的工厂就好了,不会影响其他的手机的生产。

第二阶段 UML 图

同样让我们借助 UML 图了解一下这个阶段工厂的样子吧。

浅析Python 简单工厂模式和工厂方法模式的优缺点

第二阶段代码

同样让我们借助代码去实现这一阶段的逻辑

from abc import ABC, abstractmethod

# 抽象工厂
class AbastractFactory(ABC):
 
 @abstractmethod
 def product_phone(self):
 pass

# 苹果工厂
class AppleFactory(AbastractFactory):
 
 def product_phone(self):
 return Apple().make()

# 小米工厂
class XiaomiFactory(AbastractFactory):
 
 def product_phone(self):
 return XiaoMi().make()
 

# 生产线
class Phone(ABC):
 	
 @abstractmethod
 def make(self):
 pass

# 苹果生产线
class Apple(Phone):
 
 def make(self):
 print("make apple")

# 小米生产线
class XiaoMi(Phone):
 
 def make(self):
 print("make xiaomi")

def client_product(factory:AbastractFactory):
 return factory

if __name__ == '__main__':
 xiaomi = client_product(XiaomiFactory())
 xiaomi.product_phone()
 apple = client_product(AppleFactory())
 apple.product_phone()

看一下运行结果:

make xiaomi
make apple

总结

上面的案例中的俩个阶段分别对应了两个设计模式,分别是:**简单工厂模式 **和 工厂方法模式。通过案例和对比,我们不难发现它们的的优缺点。

简单工厂模式优缺点

  • 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
  • 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

工厂方法模式优缺点

  • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
  • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类

以上就是浅析Python 简单工厂模式和工厂方法模式的优缺点的详细内容,更多关于Python 工厂模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
python遍历文件夹下所有excel文件
Jan 03 Python
Django视图和URL配置详解
Jan 31 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
python实现关键词提取的示例讲解
Apr 28 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
python实现弹跳小球
May 13 Python
Django的性能优化实现解析
Jul 30 Python
Python中可变和不可变对象的深入讲解
Aug 02 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
对python中list的五种查找方法说明
Jul 13 #Python
使用Python项目生成所有依赖包的清单方式
Jul 13 #Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 #Python
Python依赖包迁移到断网环境操作
Jul 13 #Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 #Python
python--shutil移动文件到另一个路径的操作
Jul 13 #Python
python virtualenv虚拟环境配置与使用教程详解
Jul 13 #Python
You might like
关于PHP中的Class的几点个人看法
2006/10/09 PHP
php支付宝接口用法分析
2015/01/04 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
使用PHP编写发红包程序
2015/07/22 PHP
点击文章内容处弹出页面代码
2009/10/01 Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
实例解析Array和String方法
2016/12/14 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python解析json文件相关知识学习
2016/03/01 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python装饰器用法示例小结
2018/02/11 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
毕业生求职简历中的自我评价
2013/10/18 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
党章培训心得体会
2014/09/04 职场文书
大学迎新生标语
2014/10/06 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL