练就Java24章真经—你所不知道的工厂方法
前言
最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了
。计划有时间就去学习,你这么有时间,还不来一起上车吗?
之所以要学习Java模式,是因为面试的时候有时间回答的不是太完整,面试过后才想起来如何回答。所以,我说了: 只有总结才是王道,只有总结才能提高
设计模式
其实正规的来说Java其实是23中设计模式,不过网上也有说是24种或者是26中的!设计模式不过是前人对代码的一种封装。用专业的话来讲:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
创建型模式,共五种:
- 1.工厂方法模式、
- 2.抽象工厂模式、
- 3.单例模式、
- 4.建造者模式、
- 5.原型模式。
结构型模式,共七种:
- 6.适配器模式、
- 7.装饰器模式、
- 8.代理模式、
- 9.外观模式、
- 10.桥接模式、
- 11.组合模式、
- 12.享元模式。
行为型模式,共十一种:
- 13.策略模式、
- 14.模板方法模式、
- 15.观察者模式、
- 16.迭代子模式、
- 17.责任链模式、
- 18.命令模式、
- 19.备忘录模式、
- 20.状态模式、
- 21.访问者模式、
- 22.中介者模式、
- 23.解释器模式。
今日重点:工厂方法模式
工厂模式是创建型模式之一,又称为静态工厂方法模式!
优点:
- 1.良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,减少模块间的耦合。
- 2.工厂方法模式的扩展性非常优秀。在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。例如在我们的例子中,需要增加一个棕色人种,则只需要增加一个BrownHuman类,工厂类不用任何修改就可完成系统扩展。
- 3.屏蔽产品类。这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不表,系统中的上层模块就不要发生变化,因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是由工厂类决定的。在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处:如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切换一下驱动名称(前提条件是SQL语句是标准语句),其他的都不需要修改,这是工厂方法模式灵活性的一个直接案例。
- 4.工厂方法模式是典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
用途:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
典型例子:
车子继承vehicle(车)类,有小汽车卡,公交车bus等,车子工厂实现工厂接口,工厂接口有抽象方法vehicle produce vehicle(String type)方法,车子工厂中实现工厂方法vehicle produce vehicle(String Type),方法中根据需要new新的车子。
示例代码:
注意事项
有人把工厂模式分为: 简单工厂模式 ,工厂方法模式,抽象工厂模式,所以多出一种模式,这里简单工厂模式比较简单,实际中用的的很少,只在很简单的情况下用,没啥好说的,据说这不是一个真正的设计模式。在这里我就不做讨论了。希望 大家也不用纠结!
项目地址:
总结
学习一个知识点要知道是什么,为什么,怎么办,要知其然。也要知其所以然!
阅读更多
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
写给我即将入学的研究生(英语学习篇)
换个角度,跟你聊聊英语学习。 说明 听说距离你新生报到还有几天。我想趁这个机会,给你写些东西。 之前,我给你的师兄师姐们写过《写给我即将毕业的研究生》。那些都是关于毕业后走上工作岗位的事情。这次给你写的,是关于未来三年,你求学过程中可能会遇到的一些实际问题。希望这些话,能对你的学习生活有些帮助。 我不想一次谈太多的东西。今天咱们就老生常谈,聊聊你的英语学习吧。 说这个问题,是因为最近一件小事儿,给我的触动。 知乎上面有一个问题,叫做《如何系统地自学 Python?》,我在后面写了自己的答案,其实就是你之前在我公众号读到过的《如何高效学Python?》。答案网址在这里。 这个答案,获得了将近 2400 个赞同,800余次感谢。 然而,在留言区里,我看到不少人把话题转移到了英语学习上。 他们要么很客气地找我要中文学习资料,要么不客气地……我就不重复了。但是显然,他们中的许多人,都不准备学英语。 我号称“爱问问题的王老师”,所以面对这个情境,也不禁在心中画了个大大的问号。 为什么他们这么反感学英语呢? 用处 原因可能不胜枚举。但是最主要的,应该是他们认为,学英语没用。 我们都观察到,许多人对...
- 下一篇
python:jieba:当你看完个这句子之后就会现发,里这词的字序是乱的
是这一个常非趣有的情事,先我出放码代:(得记要自己去pip下一jieba分词): import jieba import random as rd ctl=True while ctl: print('-'*30) msg=input('输入句子:\n') msg_words=list(jieba.cut(msg)) res=[] for word in msg_words: word=list(word) rd.shuffle(word) res.append(''.join(word)) print(''.join(res)) 我现在正在使用这个具工在IM软件上和人天聊,前目还没有人提出全完懂不看我在说什么,哈哈
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主