各位小伙伴好,今天给大家主要介绍一下简单工厂模式、工厂模式和抽象工厂模式的区别及各自的优缺点。

(本文实现语言为Python3)

【前言】 众所周知今天所讲的内容是

设计模式的一类;对于设计模式这个概念,我想首先请大家问问自己:1、什么是设计模式 2、我们为什么要了解并学习设计模式?

从我上学的时候我相信大家跟我一样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能用呢?一系列的问题...Emm算了到时候再想想(lazy)。随着实践的不断增多,现在我想可以对这些问题有个初步的回答了:

1、在我看来,设计模式外在看是经过前人不断实践总结出的针对某些指定场景极其好用的一种代码结构设计模板;内在看其实是一种设计思想(即为什么他们会这么想,这样想较之其他方法有什么好处)。当我们真正的理解设计思想的时候,就可能会在面对问题和场景时自然而然的灵活运用到多种设计模式,而不是单一的刻板结构。

2、在工程化的开发中,需求往往是会不断变化的,这也是让很多开发人员及其烦躁的地方,所以才会有开发与产品的亲密关系。设计模式就是为了抵御外部需求变化产生的。设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。)一个好的设计在之后的开发中,包括发生重大需求变化的时候,往往代码只需要进行简单重构去进行适配,而不是通过打补丁的方式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,大大增强了维护性。

综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复用、可扩展、可维护、够灵活)

【正文】

首先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化而用这样的工厂形式去实例化对象呢?

因为【待实例化对象太多(子类多且变动、调用频繁)或者实例化对象的过程、准备比较复杂】,直接实例化意味着每次都用重复的去执行实例化这个操作,如果有很多待实例化的操作,那么就要重复执行很多次,更不要说万一在实例化之前还要执行一堆配置项的初始化。所以用工厂模式去代替直接实例化对象是为了可复用,并且可以实现模块间的解耦。

如果是简单的实例化是没有必要引入工厂模式的,这样还会增加系统的复杂度。

简单工厂模式和抽象工厂模式都是派生于工厂模式的,属于一类;在对问题的解决上你可以理解成三种方案,解决某类问题用某种方案最好;但在复杂程度上来说算是层层递进的。我这里就按实现的简单程度升序说明。(这里我准备用实例化手机对象举例说明)

一、简单工厂模式(又叫静态工厂模式)

顾名思义,这是对工厂模式的一种“简单”实现,也是理解起来比较简单的。它的本质是通过传入不同的参数来实现多态,达到实例化不同对象的目的。

classMobileFactory:"""简单工厂模式 生产手机的工厂"""

defget_mobile(self, name):if name == 'huawei':returnHuaWei()elif name == 'iphone':returnIphone()classMobliePhone:pass

classHuaWei(MobliePhone):pass

classIphone(MobliePhone):passhw= MobileFactory().get_mobile('huawei')

ip= MobileFactory().get_mobile('iphone')print(hw) #<__main__.huawei object at>

print(ip) #<__main__.iphone object at>

二、工厂模式(又称为创建模式)

是对简单工厂模式多了一层抽象,将实例化某一类对象具体细分给对应的工厂,而不是在一个工厂里通过依赖参数

classMobileFactory:"""工厂模式 生产手机的工厂"""

defget_mobile(self):pass

classHWFactory(MobileFactory):defget_mobile(self):return 'get a HW phone'

classIphoneFactory(MobileFactory):defget_mobile(self):return 'get an iphone'hw, ip=HWFactory(), IphoneFactory()print(hw.get_mobile()) #get a HW phone

print(ip.get_mobile()) #get an iphone

三、抽象工厂模式

是对工厂模式又进行了一层抽象,不单单是像工厂模式只生成一类产品,而是一系列产品,并且可以像零件一样灵活配置给各工厂。

"""抽象工厂模式

【假设】华为和苹果都生产手机和屏幕,而我家只生产屏幕"""

#有屏幕和手机两款产品

classScreen:def __init__(self):print('i am a screen')classMobile:def __init__(self):print('i am a mobile')#三个厂家各自的屏幕和手机

classHWScreen(Screen):def __init__(self):print('HW screen')classIphoneScreen(Screen):def __init__(self):print('Iphone screen')classMyScreen(Screen):def __init__(self):print('My screen')classHWMobile(Mobile):def __init__(self):print('HW Mobile')classIphoneMobile(Mobile):def __init__(self):print('Iphone Mobile')#生产工厂

classFactory:defget_screen(self):pass

defget_mobile(self):pass

#各家自己的工厂

classHWFactory(Factory):defget_mobile(self):returnHWMobile()defget_screen(self):returnHWScreen()classIphoneFactory(Factory):defget_screen(self):returnIphoneScreen()defget_mobile(self):returnIphoneMobile()classMyFactory(Factory):defget_screen(self):returnMyScreen()#我要生产东西咯

hw, ip, my =HWFactory(), IphoneFactory(), MyFactory()

hw.get_mobile()#HW Mobile

hw.get_screen() #HW screen

ip.get_mobile() #Iphone Mobile

ip.get_screen() #Iphone screen

my.get_screen() #My screen

【总结与说明】

首先说明由于Python面向对象比较彻底,天然的实现了多态,所以例子看起来可能不如静态语言Java更加清晰,但是可以通过例子理解要传递表达的设计思想。

看完上述三段代码示例后,相信大家可能有的人会豁然开朗,有的人可能只是刚刚梳理好思路。在这里我希望大家先问问自己三个模式的优缺点,并且带着对它们的疑问进行代码实践,这样才会对理解和感悟有更深刻的认识。

一、简单工厂模式 【优点】:1、客户端创建对象时只需要记住特定的参数,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)

2、创建对象不需要单独实例化,而是通过工厂类直接获取示例(实现复用)

【缺点】:1、实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。

2、不方便扩展子类

【应用场景】:适合业务简单或者产品较少的情况

二、工厂模式        【优点】:1、在简单工厂的基础上遵循了开闭原则,又进行了解耦,工厂类分为具体的工厂类

【缺点】:1、每增加一个工厂,就要额外开发一个工厂

【应用场景】:正文中符合工厂模式的情况,多由于解耦

三、抽象工厂模式   【优点】:1、正是由于复杂的抽象关联关系使得在类的内部对一系列产品组的管理很方便

【缺点】:1、扩展很费力,每次要修改很多类。

【应用场景】:待创建的对象是一系列相互关联或相互依赖的产品族时

JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点相关推荐

  1. java 工厂模式 计算器_简单工厂模式实现简易计算器

    packageFactoryMethodPattern;/*创建人:czc 创建时间:2019/12/16 创建用途:简单工厂模式实现计算器--主界面*/ import javax.swing.*;i ...

  2. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式

    1.首先看看下面的例子: try{ str=" abcdefg abcdefghijkl "; re1=str.match(/ [\W\w]+?/ig); alert(" ...

  3. java mvc外文文献_毕业论文外文翻译-Spring的web MVC 构架模式.doc

    Web MVC with the Spring Framework Juergen Hoeller 1.????? Introduction: Spring the Application Frame ...

  4. java爬虫自动识别验证码_简单Java爬虫(一)爬取手机号码

    原创 野狗菌 希望你能喜欢 今天 关于本文: 本文介绍一个简单Java爬虫,获取网页源码,爬取电话号码. 本篇教程用我的博客一个测试网页演示. --野狗菌[希望你能喜欢] 测试页面: https:// ...

  5. 苹果手机有护眼模式吗_睡觉前忍不住刷手机?除了夜间模式,这些护眼小技巧赶快收好!...

    ​不做深度指南,只愿浅度指北 最近几天,不知怎地,突然睡不着觉,每天刷手机到深夜,可屏幕太亮了,仿佛照得整个房间都在冒光,就导致了一系列的套娃现象:屏幕亮→睡不着→刷手机→屏幕亮-- 但手机那么好玩, ...

  6. 伺服速度控制模式接线图_伺服参数设置很重要(位置控制模式、速度控制模式、力矩控制)...

    伺服在自动化设备的组成中占有重要地位.伺服是在其额定转速范围内,属于恒力矩输出.且本身具有多种反馈调节,用来保证伺服的运行精度以及输出力矩的精度.全功能的伺服控制器拥有3多种控制模式,每种控制模式的控 ...

  7. java的同步关键字_简单了解Java synchronized关键字同步

    简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记:  synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...

  8. java url特殊字符处理_简单实例处理url特殊符号处理(2种方法)

    我遇到的问题是:url里的参数内容包含&符合,我有两种方法解决 其一方法是:在页面用JS转码,例子如下(前端处理) ${group.cn }) function test(a,b){ aler ...

  9. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

最新文章

  1. django NoReverseMatch 错误问题
  2. c语言五子棋坐标覆盖,跪求C语言五子棋悔棋部分实现
  3. 【mysq】远程访问权限(允许远程连接)
  4. python笔记之序列(tuple的基本使用和常用操作)
  5. centos Error: Cannot find a valid baseurl for repo: base 解决方法
  6. 检查计算机网络是否连通可运行什么命令,用ping命令如何检测目标主机是否能连通...
  7. 音乐播放插件Aplayer+WebAPI的使用【附下载】
  8. 一个Lumen多层拆分手记
  9. Java 常用命令总结
  10. spring - 源码下载与构建
  11. 你手机里装过最牛的软件是什么,精选15款分享,有一个你没用过
  12. 旧版微信支付文档链接
  13. Android项目:基于安卓Android平台手机商城系统app(计算机毕业设计)
  14. 开发工具篇——常用开发工具分享
  15. pytorch基础---李博文记录索引
  16. TCL作价5000万美元收购美国Novatel Wireless公司MIFI业务
  17. Kafka实践(八):Kafka的控制器controller
  18. Unity--分场景
  19. 『JAVA集合·学习之路』-List(包含底层源码实现)
  20. 【经验】谷歌翻译不能使用的解决方法

热门文章

  1. 〖金融帝国实验室〗(Capitalism Lab)关于“确认开发房地产DLC”的提示(官方权威解答)
  2. Golang的strings.Builder
  3. CoreJava基础之集合框架(Set/Map集合)
  4. RocketMQ异常:sendDefaultImpl call timeout
  5. php 伪静态 rewriterule,PHP实现伪静态 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 是什么意思?...
  6. python 批量读取csv 文件到dataframe_python 批量读取csv_Python Pandas批量读取csv文件到dataframe的方法...
  7. 推荐几个实用Cocos Creator插件!看过的都说好
  8. Unity常用插件:In-game Debug Console
  9. Docker 的第二次死亡
  10. AI如何导入PNG文件,保持透明