设计模式-工厂模式的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]相关推荐

  1. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  2. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  3. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  4. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  5. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  6. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  7. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  8. Java常用设计模式————工厂模式

    简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

  9. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

最新文章

  1. JFreeChart入门
  2. C 关于unsigned int compzero = ~0;与unsigned int compzero = 0xFFFF; 的区别!
  3. 你是否能判断电机损毁风险?
  4. Install GIT in Ubuntu
  5. matlab与ie交互
  6. Mysql数据库的读写分离
  7. Scala和Java二种方式实战Spark Streaming开发
  8. TaskScheduler一个.NET版任务调度器
  9. 【Linux】文件系统及软硬连接
  10. 完全兼容ADI的ADM2582E/ADM2587E的(MORNSUN)TD(H)541S485H
  11. html不用画布太阳系示意图,html5-canvas-太阳系2
  12. minigui 3.2.0:基于miniStudio应用TrueType字体的过程(1)
  13. 阿里巴巴编码规范技能认证考试心得与试题
  14. 2019,苹果艰难又关键的一年
  15. 【IT互联网行业内,什么岗位工作更有前景?】
  16. vue项目打包后出现页面布局异常、图片显示不出来等问题
  17. 一位在微软公司的粉丝,写给我的信
  18. 如何求一个关系模式的候选码
  19. Hadoop常用命令集合
  20. 使用少量数据去除神经网络中的水印 -- WILD

热门文章

  1. 中国剩余定理模数不互素的情况
  2. ML - 线性回归(Linear Regression)
  3. STM32MP157驱动开发——Linux IIO驱动(上)
  4. Scroller的用法和一些理解
  5. python反序数函数_python逆序函数
  6. 网站防篡改有什么方法
  7. 域控服务器里没有internet时间,server2008r2域控时间设置internet时间同步的方法
  8. H - Shifting Sort
  9. Unity 3D 动画系统(Mecanim)|| Unity 3D 人形角色动画(Avatar)
  10. 我被List中remove()方法的陷阱,坑惨了!