【DRP】——工厂模式
小编最近又复习了一遍Java版的工厂模式模式,分享读者们一下,欢迎阅读啊!
【设计模式一 工厂模式Factory】
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?
解决方案:建立一个工厂来创建对象。
【工厂三姐妹定义】
1、简单工厂模式:由一个工厂类根据传入的参量决定创建哪一种产品类的实现。
2、工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
3、抽象工厂模式:创建一系列相关的对象的接口,而无需制定他们具体的类。
这三种模式是从上到下逐步抽象,并且更具有一般性。GoF将工厂分为两类:工厂方法模式与抽象工厂模式,简单工厂看为工厂方法模式的一种特例。
【分析】 我们已生产电视机为例
1、简单工厂模式
客户要一个电视机,则就去创建一个电视机工厂,把创建电视的操作一些都放到了工厂里面去,客户直接使用工厂的创建方法,传入电视机的型号就可以了。
电视接口:
package com.bjpowernode.pattern;public interface TV {public void turnOn();public void turnOff();
}
海尔电视类:
package com.bjpowernode.pattern;public class HaiErTV implements TV {public void turnOff() {System.out.println("HaiErTV.turnOff()");}public void turnOn() {System.out.println("HaiErTV.turnOn()");}}
长虹电视类:
package com.bjpowernode.pattern;public class ChangHongTV implements TV {public void turnOff() {System.out.println("ChangHongTV.turnOff()"); }public void turnOn() {System.out.println("ChangHongTV.turnOn()"); }}
电视工厂类:
package com.bjpowernode.pattern;//采用简单工厂将产品创建细节隐藏
//这样产品发生改变不会对客户造成影响
public class TVFactory {public static final String HAI_ER = "海尔";public static final String CHANG_HONG = "长虹";public static TV createTV(String type) {TV tv = null;if (HAI_ER.equals(type)) {//构造海尔的电视//.....//......//......//增加一个步骤tv = new HaiErTV();}else if (CHANG_HONG.equals(type)) {//构造长虹的电视//.....//......//......//......//.......tv = new ChangHongTV();}else {throw new RuntimeException("无法生产!"); }return tv;}
}
客户端:
package com.bjpowernode.pattern;public class Client {public static void main(String[] args) {//取得海尔的电视//TV tv = TVFactory.createTV(TVFactory.HAI_ER);//取得长虹的电视TV tv = TVFactory.createTV(TVFactory.CHANG_HONG);tv.turnOn();}
}
现在需求改了:客户想要新增一种新的电视品牌,都要在工厂类中增加相应的创建业务逻辑,也就是要新增else if ,这显然违背了开闭原则。简单来说就是只有一个工厂类对应这些产品,加入新的产品会累坏工厂的。所以相应的出现了工厂方法模式。工厂类定义成了接口,而每新增的电视机类型,就增加该电视机类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
2、工厂方法模式
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“电视工厂类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!
电视接口:
package com.bjpowernode.pattern;public interface TV {public void turnOn();public void turnOff();
}
海尔电视类:
package com.bjpowernode.pattern;public class HaiErTV implements TV {public void turnOff() {System.out.println("HaiErTV.turnOff()");}public void turnOn() {System.out.println("HaiErTV.turnOn()");}}
长虹电视类:
package com.bjpowernode.pattern;public class ChangHongTV implements TV {public void turnOff() {System.out.println("ChangHongTV.turnOff()"); }public void turnOn() {System.out.println("ChangHongTV.turnOn()"); }}
电视工厂接口:
package com.bjpowernode.pattern;public interface TVFactory {public TV createTV();
}
海尔工厂类:
package com.bjpowernode.pattern;public class TVFactory4HaiEr implements TVFactory {public TV createTV() {//构造海尔的电视//.....//......//......//增加一个步骤return new HaiErTV();}}
长虹工厂类:
package com.bjpowernode.pattern;public class TVFactory4ChangHong implements TVFactory {public TV createTV() {//构造长虹的电视//.....//......//......//......//.......return new ChangHongTV();}}
客户端:
package com.bjpowernode.pattern;public class Client {public static void main(String[] args) {//取得海尔的工厂//TVFactory factory = new TVFactory4HaiEr();//取得海信的工厂//TVFactory factory = new TVFactory4HaiXin();//取得长虹的工厂TVFactory factory = new TVFactory4ChangHong();TV tv = factory.createTV();tv.turnOn();}
}
工厂方法模式的优点:支持OCP原则(开闭原则),面向对象接口,解耦合
使用场景:隐藏产品创建细节,单一系列产品创建
随着客户的要求越来越高,电视机需要配置笔记本电脑。于是这个工厂开始生产电视机和笔记本电脑。这时候工厂有二个系列的产品:电视机和笔记本电脑.电视机必须使用对应的笔记本电脑才能使用.这时候分别使用一个电视机工厂和一个笔记本工厂都不能满足我们的需求,我们必须确认电视机跟笔记本的对应关系。因此把电视机工厂跟笔记本工厂联系在一起。因此出现了抽象工厂模式。
3、抽象工厂
给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
1)系统中有多个产品族,而系统一次只可能消费其中一族产品。
2)同属于同一个产品族的产品以其使用。
电视接口:
package com.bjpowernode.pattern;public interface ProductTV {public void resolution();
}
电视A类:
package com.bjpowernode.pattern;public class TVA implements ProductTV {public void resolution() {System.out.println("电视A");}}
电视B类:
package com.bjpowernode.pattern;public class TVB implements ProductTV {public void resolution() {System.out.println("电视B");}}
笔记本接口:
package com.bjpowernode.pattern;public interface ProductComputer {public void keyBoard();
}
笔记本A类:
package com.bjpowernode.pattern;public class ComputerA implements ProductComputer {public void keyBoard() {System.out.println("笔记本A");}}
笔记本B类:
package com.bjpowernode.pattern;public class ComputerB implements ProductComputer {public void keyBoard() {System.out.println("笔记本B");}}
工厂接口:
package com.bjpowernode.pattern;public interface Factory {public ProductComputer productComputer();public ProductTV productTV();}
工厂A接口:
package com.bjpowernode.pattern;public class FactoryA implements Factory {public ProductComputer productComputer() {return new ComputerA();}public ProductTV productTV() {return new TVA();}}
工厂B接口:
package com.bjpowernode.pattern;public class FactoryB implements Factory {public ProductComputer productComputer() {return new ComputerB();}public ProductTV productTV() { return new TVB();}}
客户端:
package com.bjpowernode.pattern;public class Client {public static void main(String[] args) {//取得A工厂Factory factory = new FactoryA();//取得A工厂中的笔记本工厂ProductComputer computerA=factory.productComputer();computerA.keyBoard();}
}
优点:对产品的增加支持OCP原则
缺点:对产品系列的增加不支持OPC原则
使用场景:对多个系列产品的创建
好了今天的博客小编就写到这里了,欢迎小伙伴们的留言。。。
【DRP】——工厂模式相关推荐
- 【Spring】工厂模式解耦
问题: 程序的耦合 耦合:程序间的依赖关系 包括:类之间的依赖 方法之间的依赖 解耦:降低程序之间的耦合关系 实际开发:编译期不依赖,运行期才依赖 解耦思路: ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
- 大话设计模式之简单的工厂模式
第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 @interface Operation : NSObject@property(nonatom ...
- 设计模式之简单工厂模式
一.概述 工厂模式具体包括了简单工厂.工厂方法.抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式. 但是它是理解其它的工厂模式的一个很好 ...
- 基础设计模式:单例模式+工厂模式+注册树模式
单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景: 一般数据库实例都会用单例模式 实现: 单例设计模式就是要一个类只能实例化一个对象. 要想让一个类只能实 ...
- 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...
- getinstance方法详解_二、设计模式总览及工厂模式详解
二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- 编程模式 之美 -- 抽象工厂模式
文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...
最新文章
- C++:名字空间的使用
- 20165330 结对编程项目-四则运算 第一周
- [Everyday Mathematics]20150204
- opencv 人脸识别 (一)训练样本的处理
- 分子计算机已经问世,纳米计算机指日可待?
- copy与mutableCopy的区别总结
- 3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析
- html5录像功能限制时间,HTML5拍照和摄像机功能实战详解
- 71. MVC 改进
- 有刷电机与无刷电机的接线方法(淘宝一卖家写的很好,厚实的实践经验)
- matlab常用函数总结
- 《沙丘》全球票房突破3.5亿美元,这部科幻巨制到底有多厉害?
- 2021年12月电子学会图形化四级编程题解析含答案:聪明的小猫
- 数智化未来5大趋势——CDEC2020中国数字智能生态大会上海站生态伙伴发展状况调查...
- 【Wordle】Day8:昨天忘了的后果就是今天输了
- 添加商务通的几种方式
- python跳出双层循环
- 日志易日志平台使用了什么开源软件
- Deepin编译安装 mongoc++ 驱动程序
- 含泪整理最优质楷体字体素材,你想要的这里都有
热门文章
- css中去掉input边框颜色,css怎么去掉input边框
- realloc函_realloc函数用法
- Ubuntu系统不能访问Windows系统分盘内容解决方案
- java读取zip文件名_java无需解压zip压缩包直接读取包内的文件名(含中文)
- 2月假新闻盘点:东莞嫖娼被拘成造假热点
- 目前我国软件人才紧缺
- kitten编程猫 学习教程(一) 学习笔记
- 如何在Linux中将目录添加到$ PATH
- Elasticsearch6.4 max number of threads [2048] for user [*] is too low, increase to at least [4096]异常
- 如何制作自己的数据集