设计模式-工厂模式的3中不同实现[JAVA]
设计模式-工厂模式的3中不同实现[JAVA]
工厂模式简介
In Factory pattern, we create object without exposing the creation logic to the client and refer to newly created object using a common interface.可以简单理解为:通过共用的接口或者工厂来创建对象,而不需求关注对象创建细节。调用端与工厂进行交互,与对象进行解耦。
3种不同的实现版本【JAVA8实现】
简单工厂实现
1. 类图
2. 实现
以华为生产手机为例,华为的一个手机工厂里能够生产P30和Mate30,P30和Mate30都能打电话,那么用户买手机的时候,只依赖手机(能打电话)这个抽象。根据华为工程提供的创建手机的方法,传入不同的手机型号,就可以获得手机的实例。
/*** 简单工厂模式* @Author: Shiraki* @Date: 2020/9/15 10:48*/
public class DemoSimpleFactory {// 模拟client调用public static void main(String[] args) {// 生产个P30SimpleHuaWeiFactory.createPhone("P30").call();// 生产个Mate30SimpleHuaWeiFactory.createPhone("Mate30").call();// 没有生产P40的手机厂// SimpleHuaWeiFactory.createPhone("P40").call();}
}// 手机打电话的接口
interface IPhoner {public void call();
}
// 产品 P30
class P30 implements IPhoner{@Overridepublic void call() {System.out.println("P30 is ringing");}
}
// 产品 Mate30
class Mate30 implements IPhoner{@Overridepublic void call() {System.out.println("Mate30 is ringing");}
}// 华为厂里生产手机
class SimpleHuaWeiFactory {public static IPhoner createPhone(String type) {IPhoner iPhoner = null;// 根据传入的参数来生产不同的类型switch (type) {case "Mate30":iPhoner = new Mate30();break;case "P30":iPhoner = new P30();break;default:throw new RuntimeException("type err");}return iPhoner;}
}
本例使用了静态方法
createPhone
创建产品,不代表这是工厂方法模式的写法。工厂方法模式和普通工厂模式不是由工厂是不是静态工厂来判断的
3. 优缺点
- 实现简单
- 产品创建耦合度高,违反开闭设计原则。
工厂方法模式
简单工厂模式中存在if或者switch分支,不满足开放-封闭原则,如果需要新增加以一个产品-华为Mate40,就意味着得改造createPhone方法支持Mate40的创创建,然后大佬提出了工厂方法模式,解决【普通工厂中新增加工厂时进行分支判断,耦合在一起创建的问题】。作为服务端只需要新增加工厂和实现工厂指定的接口即可。客户端按照需求引用不同工厂。
1. 类图
2. 实现
/*** 工厂方法模式* @Author: Shiraki* @Date: 2020/9/15 10:48*/
public class DemoSimpleFactory {// 模拟client调用public static void main(String[] args) {// 此处使用new来创建了工厂,实际开发中工厂以单例存在IHuaWeiFactory factory = new P30HuaWeiFactory();// 生产个P30factory.createPhone().call();// 生产个Mate30factory = new Mate30HuaWeiFactory();factory.createPhone().call();// 面向对象的开放-封闭原则 能够避免swith或者if分支 }
}// 手机打电话的接口
interface IPhoner {public void call();
}
// 产品 P30
class P30 implements IPhoner {@Overridepublic void call() {System.out.println("P30 is ringing");}
}// 产品 Mate30
class Mate30 implements IPhoner {@Overridepublic void call() {System.out.println("Mate30 is ringing");}
}interface IHuaWeiFactory {public IPhoner createPhone();
}// P30 的厂专门生产P30
class P30HuaWeiFactory implements IHuaWeiFactory{@Overridepublic IPhoner createPhone() {return new P30();}
}// Mate30的厂串门生产Mate30
class Mate30HuaWeiFactory implements IHuaWeiFactory {@Overridepublic IPhoner createPhone() {return new Mate30();}
}
3. 优缺点
- 产品创建低耦合
- 每新增一个产品,就会增加一个工厂,产品种类过多时,系统维护较为复杂。
抽象工厂模式
工厂方法解决了简单工厂存在的耦合问题,但是工厂方法类在遇到生产的产品种类过多时,系统会变的比较复杂。于是提出了把相同类别产品进行归类,让指定的工厂去生产一类产品,从而减少工厂的个数。有的文档里称为产品族。
以下例子就是建立生产30系列(老系列)的工厂和生产40系列(新系列)的工厂。这两个厂都能生产p和mate系列的手机,但是生产的版本不一致。要生产50系列的手机,只需要新建一个产品工厂即可。30、40系列工厂无需调整。
1. 类图
2. 实现
package lxf.design.pattern.factory.abstract1;/*** 抽象工厂方式,* @Author: Shiraki* @Date: 2020/9/15 16:38*/
public class DemoAbstractFactory {public static void main(String[] args) {// 获取生产30系列的工厂IHuaWeiFatory factoryOf30Serial = new Serial30HuaWeiFactory();// 生产个matefactoryOf30Serial.ProductMateSerialPhone().call();// 生产个pfactoryOf30Serial.ProductPSerialPhone().call();// 获取生产40系列的工厂IHuaWeiFatory factoryOf40Serial = new Serial40HuaWeiFactory();factoryOf40Serial.ProductPSerialPhone().call();factoryOf40Serial.ProductMateSerialPhone().call();}
}// 手机打电话的接口
interface IPhoner {public void call();
}// 产品 P30
class P30 implements IPhoner {@Overridepublic void call() {System.out.println("P30 is ringing");}
}// 产品 P40
class P40 implements IPhoner {@Overridepublic void call() {System.out.println("P40 is ringing");}
}// 产品 Mate30
class Mate30 implements IPhoner {@Overridepublic void call() {System.out.println("Mate30 is ringing");}
}// 产品 Mate40
class Mate40 implements IPhoner {@Overridepublic void call() {System.out.println("Mate40 is ringing");}
}
interface IHuaWeiFatory {IPhoner ProductPSerialPhone();IPhoner ProductMateSerialPhone();
}// 30系列产品线
class Serial30HuaWeiFactory implements IHuaWeiFatory {// p系列产品@Overridepublic IPhoner ProductPSerialPhone() {return new P30();}// mate系列产品@Overridepublic IPhoner ProductMateSerialPhone() {return new Mate30();}
}// 40系列产品线
class Serial40HuaWeiFactory implements IHuaWeiFatory {@Overridepublic IPhoner ProductPSerialPhone() {return new P40();}@Overridepublic IPhoner ProductMateSerialPhone() {return new Mate40();}
}
3. 优缺点
- 增加产品组比较容易,也就是产品分类不变的情况,增加一系列产品比较方便,同时符合开闭原则。
- 增加产品类别比较费力,意味着需要修改抽象工厂接口,而已存在的工厂都要进行修改,违法开闭原则,耦合度较高。
总结(引用)
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。[说的太好了直接引用]
参考
抽象工厂模式的优缺点和适用场景
设计模式-工厂模式的3中不同实现[JAVA]相关推荐
- 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设计模式-工厂模式(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常用设计模式————工厂模式
简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...
- 设计模式---工厂模式
设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...
最新文章
- JFreeChart入门
- C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!
- 你是否能判断电机损毁风险?
- Install GIT in Ubuntu
- matlab与ie交互
- Mysql数据库的读写分离
- Scala和Java二种方式实战Spark Streaming开发
- TaskScheduler一个.NET版任务调度器
- 【Linux】文件系统及软硬连接
- 完全兼容ADI的ADM2582E/ADM2587E的(MORNSUN)TD(H)541S485H
- html不用画布太阳系示意图,html5-canvas-太阳系2
- minigui 3.2.0:基于miniStudio应用TrueType字体的过程(1)
- 阿里巴巴编码规范技能认证考试心得与试题
- 2019,苹果艰难又关键的一年
- 【IT互联网行业内,什么岗位工作更有前景?】
- vue项目打包后出现页面布局异常、图片显示不出来等问题
- 一位在微软公司的粉丝,写给我的信
- 如何求一个关系模式的候选码
- Hadoop常用命令集合
- 使用少量数据去除神经网络中的水印 -- WILD
热门文章
- 中国剩余定理模数不互素的情况
- ML - 线性回归(Linear Regression)
- STM32MP157驱动开发——Linux IIO驱动(上)
- Scroller的用法和一些理解
- python反序数函数_python逆序函数
- 网站防篡改有什么方法
- 域控服务器里没有internet时间,server2008r2域控时间设置internet时间同步的方法
- H - Shifting Sort
- Unity 3D 动画系统(Mecanim)|| Unity 3D 人形角色动画(Avatar)
- 我被List中remove()方法的陷阱,坑惨了!