Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

工厂模式:


工厂模式可以分为三类:

1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)
3)抽象工厂模式(Abstract Factory)


简单工厂模式

插头 分为二孔插头和三孔插头。
首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}
public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");} }

然后创建插头工厂类

/**
* @author hjn
*插头工厂类
*/
public class PinFactory {/*** @param type* @return* 根据插头数返回相对的插头对象*/public static Pin creatPin(int type) {switch (type) {case 2:return new PinTw();case 3:return new PinTh();default:break;}return null;}
}

最后 测试类 :

public class TestPin {public static void main(String[] args) {Pin pinth = PinFactory.creatPin(3);Pin pintw = PinFactory.creatPin(2);}
}        

 

这就是简单工厂模式。

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
先来看看它的组成:
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。

下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的插头型号的时候,想要一种更多头的新型插头,只要这种插头符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型插头,都要在工厂类中增加相应的创建业务逻辑(creatPin(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。
我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员。
于是工厂方法模式作为救世主出现了。 工厂类定义成了接口,而每新增的插头种类型,就增加该插头种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。

简单工厂模式的优缺点
 优点:客户端不需要修改代码。
 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。


工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
工厂方法模式组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有 的代码。可以看出工厂角色的结构也是符合开闭原则的!

首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

 

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");}
}

然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {public Pin creatPin();}

然后创建 二孔插头和三孔插头的工厂

 

/**
* @author hjn
*二孔的工厂类 
*/
public class PinTwFactory implements IPinFactory {Pin ptw=new PinTw();public Pin creatPin() {    return ptw;}
}/**
* @author hjn
*三孔的工厂类
*/
public class PinThFactory implements IPinFactory {Pin pth=new PinTh();public Pin creatPin() {    return pth;}
}

 

测试类 :

 

public class TestPin {public static void main(String[] args) {PinThFactory pthf =new PinThFactory();Pin pinth = pthf.creatPin();PinTwFactory ptwf=new PinTwFactory();Pin pintw = ptwf.creatPin();}
}

 

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂,当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。

  好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。
  缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。


抽象工厂模式

首先 创建插头产品类 Pin

public class Pin {protected String PinType;
}

然后分别创建二孔插头和三孔插头类

/**
* @author hjn
*二孔插头类
*/
public class PinTw extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTw() {System.out.println("I am 2孔 Pin");}
}
 
/**
* @author hjn
*三孔插头类
*/
public class PinTh extends Pin {private String PinType;public String getPinType() {return PinType;}public void setPinType(String pinType) {PinType = pinType;}public PinTh() {System.out.println("I am 3孔 Pin");}
}

 


然后创建插头工厂接口:

/**
* @author hjn
* 工厂方法接口*
*/
public interface IPinFactory {public Pin creatPinTw();public Pin creatPinTh();
} /**
* @author hjn
*Pin工厂实现类
*/
public class PinFactoryImpl implements IPinFactory {@Overridepublic Pin creatPinTw() {return new PinTw();}@Overridepublic Pin creatPinTh() {    return new PinTh();}}

 

测试类

public class TestPin {public static void main(String[] args) {PinFactoryImpl pin = new PinFactoryImpl();Pin ptw = pin.creatPinTw();Pin pth = pin.creatPinTh();}
}

 

 抽象工厂模式,一个具体工厂可以制造几个产品

优点:易于交换产品系列,例如Access和SQLServer数据库之间切换。
  缺点:如果需要增加新的产品树,那么就要新增三个产品类,并且要修改三个工厂类。这样大批量的改动是很丑陋的做法。


工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。


区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

转载于:https://www.cnblogs.com/caixiaohua/p/6760389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天很多 CTO 都是被干掉的,因为他没有成就业务

作者|乔新亮 编辑|邓艳琴 我可以丝毫不开玩笑地说,今天,很多传统企业里的研发都只是“工人”,哪怕是 CTO,充其量也只是“高级工人”,如果不转换思维去成就业务,就只能停留在工人级…

中航工业集团金网络(北京)电子商务有限公司副总经理刘正珩:航空“智”造的供应链支撑平台...

编者按 “十三五”时期是我国贸易发展的重要战略机遇期,物流产业发展迅速,智慧供应链已经成为推动流通大国向流通强国过程中的重要行动。6月2日,由上海市国有资产监督管理委员会、上海市邮政管理局、上海市商务委员会指导,上海市国…

创建、检查和反编译世界上(几乎)最短的 C# 程序

创建、检查和反编译世界上(几乎)最短的 C# 程序原文来自https://www.stevejgordon.co.uk/creating-inspecting-decompiling-the-worlds-smallest-csharp-program在这篇文章中,我认为创建世界上(几乎)最短的 C# 程序然后…

Linux下画原理图和PCB

Linux下画原理图和PCBWindows下大名鼎鼎的Allegro和经典的Protel 99SE都是不支持Linux操作系统的。做Linux驱动开发免不了要看一下原理图和PCB。一般的做法有三种: 1.主机使用Windows系统,将Linux装在VMWARE之类的虚拟机中这样能够使用Windows下的软件看…

配置中心 App Configuration (二):Feature Flag 功能开关特性

写在前面Web服务开发过程中我们经常有这样的需求:某些功能我必须我修改了配置才启用,比如新用户注册送券等;某个功能需到特定的时间才启用,过后就失效,比如春节活动等;某些功能,我想先对10%的用…

联想(Lenovo)小新310经典版进bios方法

1,找到novo按钮。 2,在关机的状态下桶一下小孔,不用任何操作,电脑进入bios选择界面。转载于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名类型

这节来讲一下C#中的匿名类型。匿名类在C#中,我们可以不去显示的声明一个类,而是通过匿名类去临时声明一个类结构去帮助我们去完成一些功能。声明一个匿名类,我们可以像下面这样做:var Anonymousnew {name"charles",year…

MySQL之MHA高可用集群

目录 一、MHA概述 1.1.MHA 是什么 1.2.MHA 的组成 1.3.MHA 的特点 二、MHA搭建准备 2.1.实验思路 三、MHA搭建 3.1配置主从复制 3.2.安装 MHA 软件 3.3.故障模拟 3.4.故障修复 四、总结 一、MHA概述 1.1.MHA 是什么 1.MHA(MasterHigh Availability&…

配置中心 App Configuration (一):轻松集成到Asp.Net Core

写在前面在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体)之前文章:Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触总体来说,Apollo和Nacos社区都比较活跃&#…

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言现象源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用常用HandlerMethodArgumentResolver介绍常用HandlerMethodReturnValueHandler介绍本文开头现象…

对不起,我不是一个自律的人

大家好,我是 🐟💨。前天,星球 的一位大学生朋友问了我几个问题:你大学时如何安排每日的时间?为什么能学那么多技术?你会学习到很晚吗?你是如何保持自律的?我觉得这几个问…

保证接口数据安全的10种方案

前言 大家好,我是程序汪,互联网项目需要特别注意数据安全,如果你简历上是互联网类型项目,安全方面肯定要能说出个一二三,下面分享下这方面的干货,大家可以记住几条,面试时好说道说道 我们日常…

Html5本地存储LocalStorage

HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储在浏览器中打开审查元素(如谷歌F12),在Resources下面可以查看里面的数据。 localStorage提供了几…

java第一季2.2

2019独角兽企业重金招聘Python工程师标准>>> 标识符: 是给变量类方法命名的符号、标识符开头可以_、字母、$命名,不可以用数字命名。关键字不可命名,大小写区分。不可以用非法字符 变量:变量类型。变量名。变量值。如&…

读《华为数字化转型之道》

数字化转型应该很多人都听过,但如果你做过 ToB 软件,听得更多的是信息化,那信息化和数字化是什么关系呢?下面用一个小例子来说说我的理解。记得刚上初中的时候,平时测验、考试的试卷,都是人工在板上进行刻写…

Thrift基本原理及使用

参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call),远程过程调用,大部分的RPC框架都遵循如下三个开发步骤: 1. 定义一个接口说明文件:描述了对象(结构体)、对象成员、接口方法等一系列信息&am…

01-H5语义化标签

转载于:https://www.cnblogs.com/Zeki/p/5901399.html

配置中心 App Configuration (三):配置的动态更新

Get Azure key-value pairs from App configuration | Serverless360写在前面我在前文:《微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core》已经介绍了Asp.net Core怎么轻易的接入azure 配置中心App Configuration(下称azure 配置中心…

万字总结 JS 数据结构与常用的算法

前言 首先,为什么我会学习数据结构与算法呢,其实主要是有两方面 第一,是我在今年的flag里明确说到我会学这个东西第二,学了这些,对自己以后在工作或者面试也会带来许多好处然后,本文是最近学习的一个总结文…

精通Java设计模式从初见到相爱之工厂+策略模式(3)

为什么80%的码农都做不了架构师?>>> 1、公司项目需求。 用户签到活动,会员签到怎么处理,超级会员怎么处理,普通用户签到怎么处理,针对不同的档次,有不同的方案,所以在项目中用到了策…