【Java设计模式】工厂模式
分工越细,项目就更容易拓展
工厂模式实现了创建者和调用者分离。
设计模式是一种思想,学习设计模式可以提高你的思考角度。
面向对象设计的基本原则:
OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。
DIP(依赖倒转原则,Dependence Inversion Principle):要针对接口
编程,不要针对实现
编程。
LoD(迪米特法则,Law of Demeter):只与你直接的朋友通信,而避免和陌生人通信。类尽量少地以来其他类,实现类与类之间的解耦。利于扩展。
不使用简单工厂的情况
简单工厂模式
package factory;public class CarFactory {public static Car createCar(String type) {Car c = null;if ("奥迪".equals(type)) {c = new Audi();} else if ("奔驰".equals(type)) {c = new Benz();}return c;}
}
方法工厂模式
工厂方法模式要点:
– 为了避免简单工厂模式的缺点,不完全满足OCP。
– 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目
或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
实际项目中,还是简单工厂用的比较多
简单工厂模式和工厂方法模式PK:
– 结构复杂度
从这个角度比较,显然简单工厂模式要占优。简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。
– 代码复杂度
代码复杂度和结构复杂度是一对矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方面肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
– 客户端编程难度
工厂方法模式虽然在工厂类结构中引入了接口从而满足了OCP,但是在客户端编码中需要对工厂类进行实例化。而简单工厂模式的工厂类是个静态类,在客户端无需实例化,这无疑是个吸引人的优点。
– 管理上的难度
这是个关键的问题。
我们先谈扩展。众所周知,工厂方法模式完全满足OCP,即它有非常良好的扩展性。那是否就说明了简单工厂模式就没有扩展性呢?答案是否定的。简单工厂模式同样具备良好的扩展性——扩展的时候仅需要修改少量的代码(修改工厂类的代码)就可以满足扩展性的要求了。尽管这没有完全满足OCP,但我们不需要太拘泥于设计理论,要知道,sun提供的java官方工具包中也有想到多没有满足OCP的例子啊。
然后我们从维护性的角度分析下。假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。反而简单工厂没有这些麻烦,当多个产品类需要修改是,简单工厂模式仍然仅仅需要修改唯一的工厂类(无论怎样都能改到满足要求吧?大不了把这个类重写)。
• 根据设计理论建议:工厂方法模式。但实际上,我们一般都用简单工厂模式。
抽象工厂模式
– 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;
支持增加产品族)
– 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务
分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
总结
工厂模式要点:
– 简单工厂模式(静态工厂模式)
• 虽然某种程度不符合设计原则,但实际使用最多。
– 工厂方法模式
• 不修改已有类的前提下,通过增加新的工厂类实现扩展。
– 抽象工厂模式
• 不可以增加产品,可以增加产品族!
• 应用场景
– JDK中Calendar的getInstance方法
– JDBC中Connection对象的获取
– Hibernate中SessionFactory创建Session
– spring中IOC容器创建管理bean对象
– XML解析时的DocumentBuilderFactory创建解析器对象
– 反射中Class对象的newInstance()
– servlet:工厂模式+单例模式
【Java设计模式】工厂模式相关推荐
- Java设计模式-工厂模式(3)抽象工厂模式
在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...
- Java设计模式-工厂模式(2)工厂方法模式
在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...
- Java设计模式-工厂模式(1)简单工厂模式
Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...
- java设计模式工厂模式_Java中的工厂设计模式
java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...
- java设计模式工厂模式_Java中的复合设计模式
java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...
- java设计模式工厂模式_Java中的桥梁设计模式
java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...
- java设计模式工厂模式_Java中的外观设计模式
java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...
- java 工厂模式的写法_[java设计模式] 工厂模式解析
什么是工厂模式? 我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式. 出现原 ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- 学习:java设计模式—工厂模式
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Facto ...
最新文章
- vuls漏洞扫描工具
- 面向.NET开发人员的Dapr——分布式世界
- 前端学习(1550):$scope和调试工具
- 基于Java封装Groovy工具类
- 2018年全国高校教师“Python编程、应用及华为大数据”培训班
- openstack nova 源码分析4-nova目录下的driver.py
- 博文视点读书节第六日丨产品大咖书单阿里云专家直播预告,更有超值代金券手慢无
- lfw分类 python_LFW精确度验证__python读写txt
- 学习spf记录引发的问题(一)
- 在Linux Mint 19.2 XFCE(x64)中安装Canon LBP2900+打印机驱动程序
- 不改一行代码,快速迁移 Laravel 应用上云
- matlab plot函数详解
- xlsm java 读取_使用POI读/写XLSM
- 破解支付宝行为/滑动/投篮验证码,淘宝行为验证码同理
- C#合并Excel单元格
- 电商后台设计:系统消息
- 树莓派3b+,4b新手入门到手开箱第一次使用之十大步骤
- Skleran-线性模型-最小角回归(LARS)
- 01区块链研究的最新进展理论、建模和工具
- Android 飞机大战