练就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新的车子。
示例代码:

注意事项
有人把工厂模式分为: 简单工厂模式 ,工厂方法模式,抽象工厂模式,所以多出一种模式,这里简单工厂模式比较简单,实际中用的的很少,只在很简单的情况下用,没啥好说的,据说这不是一个真正的设计模式。在这里我就不做讨论了。希望 大家也不用纠结!
项目地址:
总结
学习一个知识点要知道是什么,为什么,怎么办,要知其然。也要知其所以然!
阅读更多
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!
练就Java24章真经—你所不知道的工厂方法的更多相关文章
- 你真的会玩SQL吗?你所不知道的 数据聚合
		
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
 - 你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)
		
前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程, ...
 - 你所不知道的五件事情--java.util.concurrent(第二部分)
		
这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘 ...
 - js类型----你所不知道的JavaScript系列(5)
		
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型等. 1.内置类型 JavaScript 有七种内置类型: • 空值(null) • 未定义( ...
 - 你所不知道的 CSS 阴影技巧与细节  滚动视差?CSS 不在话下  神奇的选择器 :focus-within  当角色转换为面试官之后  NPOI 教程 - 3.2 打印相关设置  前端XSS相关整理  委托入门案例
		
你所不知道的 CSS 阴影技巧与细节 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow ...
 - Android中Context详解 ---- 你所不知道的Context(转)
		
Android中Context详解 ---- 你所不知道的Context(转) 本文出处 :http://b ...
 - 你所不知道的html5与html中的那些事(四)——文本标签
		
文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后 ...
 - 你所不知道的库存超限做法  服务器一般达到多少qps比较好[转]  JAVA格物致知基础篇:你所不知道的返回码  深入了解EntityFramework Core 2.1延迟加载(Lazy Loading)   EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?  藏在正则表达式里的陷阱  两道面试题,带你解析Java类加载机制
		
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
 - 你所不知道的setInterval
		
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
 
随机推荐
- HDB3 译码器
			
一.HDB3译码方案一: 插入V/B的情况是有两种,两个或三个零两端同极性,也就是要把代码二进制表示的“+1 0 0 0 +1”或“-1 0 0 0 -1”变成“1 0 0 0”,把“+1 0 0 + ...
 - 三十七、Linux 线程——线程清理和控制函数、进程和线程启动方式比较、线程的状态转换
			
37.1 线程清理和控制函数 #include <pthread.h> void pthread_cleanup_push(void (* rtn)(void *), void *arg) ...
 - 【python小练】0012题
			
第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好 ...
 - webpack提示安装webpack-cli
			
webpack 安装后提示CLI webpack 4X 后需要安装webpack-cli 请注意需要安装在同一目录 方法: 第一步:npm install -g webpack-cli 第二部: 同步 ...
 - Vue Router学习笔记
			
前端的路由:一个地址对应一个组件 Vue Router中文文档 一.路由基本使用 第1步:导入Vue Router: <script src="https://unpkg.com/vu ...
 - 树链剖分模板(洛谷P3384)
			
洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...
 - day 10 - 2 函数练习
			
1.写函数 接收 n 个数字 求这些参数数字的和 def sum_func(*args): total = 0 for i in args: total += i return total prin ...
 - linux下 gdb+coredump 调试偶发crash的程序
			
1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配 ...
 - 老师博客copy
			
新闻 管理 Py西游攻关之基础数据类型 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频 ...
 - 使用Swagger自动生成API文档
			
⒈添加pom依赖 <!-- Swagger核心包,用于扫描程序生成文档数据 --> <dependency> <groupId>io.springfox</g ...