前方高能《一故事一设计模式》PDF 电子书已经上线,关注公众号即可获取。

个人博客原文
创建型模式:工厂方法

简介

姓名:工厂方法

英文名:Factory method Pattern

价值观:扩展是我的专属

个人介绍

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
(来自《设计模式之禅》)

你要的故事

还记得上一篇 单例模式 中的故事么?小明开着汽车去旅游、去学校、去聚会。这一次还是延续小明的故事,一个故事能讲 2 个设计模式,不容易呀。。。(每次想故事都想破脑袋,每一篇文章至少有 3 个故事从脑子里闪过,但最终留下的只有一个适合,为了就是能比较清晰简单的说明设计模式中的关键要点。)

简单工厂

小明家里以前不算很富裕,但是还是有一个不错的车库,什么汽车、摩托车、自行车啥的都放在这个车库里。小明每次要出去,都会到车库里面挑合适的车出发。比如,小明最近期末考试了,骑摩托车去学校考试,考完试之后,小明就准备去旅游,这次决定自驾游,开着自己家的小汽车去。这个场景我们用代码描述下。

public class SimpleFactoryTest {public static void main(String[] args) {XiaoMing xiaoMing = new XiaoMing();// 小明骑摩托车去学校IVehicle motorcycle = GarageFactory.getVehicle("motorcycle");xiaoMing.goToSchool(motorcycle);// 小明开汽车去旅游IVehicle car = GarageFactory.getVehicle("car");xiaoMing.travel(car);}}/*** 车库*/
class GarageFactory {public static IVehicle getVehicle(String type) {if ("car".equals(type)) {return new Car();} else if ("motorcycle".equals(type)) {return new Motorcycle();}throw new IllegalArgumentException("请输入车类型");}}/*** 交通工具*/
interface IVehicle {void run();
}/*** 汽车*/
class Car implements IVehicle {@Overridepublic void run() {System.out.println("开汽车去。。。。");}
}/*** 摩托车*/
class Motorcycle implements IVehicle {@Overridepublic void run() {System.out.println("骑摩托车去。。。。");}
}class XiaoMing {public void goToSchool(IVehicle vehicle) {System.out.println("小明去学校");vehicle.run();}public void travel(IVehicle vehicle) {System.out.println("小明去旅游");vehicle.run();}}

上面代码看懂了么? 小明家里有一个车库 GarageFactory,里面放着汽车 Car 和摩托车 Motorcycle,小明要出去的时候,就到车库选择车,通过传递参数给 GarageFactory.getVehicle(),指明要什么车,然后小明就骑着车出发了。

这个代码真正的术语叫:简单工厂模式(Simple Factory Pattern),也叫做静态工厂模式。它是工厂方法中的一个实现方式,从字面理解就可以知道,它是最简单的工厂方法实现方式。它有一点点小缺陷,就是扩展性不够好,在上面代码中,小明只能骑摩托车或者开汽车,如果小明要骑单车出去呢?势必得在 GarageFactory 中添加 if 是自行车的逻辑。这违反了哪条规则了?是不是那个允许扩展,拒绝修改的开闭原则

不是说简单工厂这种实现方式不好,而是扩展性不够,在平时的开发中,简单工厂模式也用得不少。在这个小明家里车不多的情况下,用一个车库也是合适的。

工厂方法

小明老爸近几年赚了不少,车迷的两父子一直买车,家里的车越来越多,这时候,他们决定多建几个车库,按车类型放置。比如,有一个汽车库,一个摩托车库。这时候小明要开汽车就去汽车库,要骑摩托车就去摩托车库。代码实现如下。

public class FactoryMethodTest {public static void main(String[] args) {XiaoMing xiaoMing = new XiaoMing();// 小明骑摩托车去学校VehicleGarage motorcycleGarage = new MotorcycleGarage();IVehicle motorcycle = motorcycleGarage.getVehicle();xiaoMing.goToSchool(motorcycle);// 小明开汽车去旅游VehicleGarage carGarage = new CarGarage();IVehicle car = carGarage.getVehicle();xiaoMing.travel(car);}}interface VehicleGarage {IVehicle getVehicle();
}/*** 汽车车库*/
class CarGarage implements VehicleGarage {@Overridepublic IVehicle getVehicle() {return new Car();}
}/*** 摩托车车库*/
class MotorcycleGarage implements VehicleGarage {@Overridepublic IVehicle getVehicle() {return new Motorcycle();}
}

上面代码重用了简单工厂实现方式的交通接口以及摩托车和汽车的实现类。代码中有 2 个车库,一个是汽车车库 CarGarage,一个是摩托车库 MotorcycleGarage。如果小明要骑自行车,只需要建一个自行车车库,完全不用去修改汽车车库或者摩托车车库,就非常符合开闭原则,扩展性大大的提高。

总结

工厂方法模式可以说在你能想到的开源框架源码中必定会使用的一个设计模式,因为开源框架很重要一点就是要有扩展性,而工厂方法模式恰恰具有可扩展性。弄懂了工厂方法模式,以后看开源代码就很得心应手啦。

参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》

代码链接:Factory method Pattern

希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号 LieBrother,第一时间获取文章推送阅读,也可以一起交流,交个朋友。

公众号之设计模式系列文章

创建型模式:工厂方法相关推荐

  1. 设计模式-创建型模式-工厂方法模式

    工程源码:c++设计模式-创建型模式-工厂方法模式https://download.csdn.net/download/qq_40788199/85541617 码云:https://gitee.co ...

  2. 创建型模式-工厂方法模式(二)

    目录 工厂方法模式描述 工厂方法模式存在的问题 解决方案 使用场景 优缺点对比 代码 工厂方法模式描述 工厂方法模式,是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象 ...

  3. 创建型模式--工厂方法模式

     概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类.  适用性 1.当一个类不知道它所必须创建的对象的类的时候.2.当一个类希望由它的 ...

  4. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  5. 创建型模式 工厂模式

    创建型模式 工厂模式 /*** 创建型模式 工厂模式* 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 .* 符合"开放-封闭"原则 通过添加代码的方式,不是通过修改代码的 ...

  6. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  7. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  8. python创建方法draw_【python设计模式-创建型】工厂方法模式

    工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...

  9. 创建型模式---工厂模式

    从简单到复杂有简单工厂模式-->工厂方法模式-->抽象工厂模式 简单工厂模式(Simple Factory Pattern) 定义 又称为静态工厂方法(Static Factory Met ...

  10. 《设计模式详解》创建型模式 - 工厂模式

    <设计模式详解> 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.2.1 结构 4.2.2.2 实现 4.2.2.3 优缺点 4.2.2.4 扩展 - 静态工厂 4. ...

最新文章

  1. vscode 终端 进入node_安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
  2. 常用[js,css,jquery,html]
  3. [Swust OJ 404]--最小代价树(动态规划)
  4. 2020年高等数学方法与提高(上海理工大学)学习笔记:多元函数微分学
  5. 2018/01/08JAVA 基础 / 接口与继承:[Q]:若父类Hero提供了一个有参的构造方法,但是没有提供无参的构造方法。子类应该怎么处理?...
  6. Gitee 轻量级 PR ——参与开源贡献,原来就是举手之劳的事
  7. ECCV 2020 论文大盘点-人员重识别(ReID)篇
  8. html图片实现左右滑动,jquery实现左右滑动式轮播图
  9. 【干货】腾讯员工职业发展框架.pdf(附下载链接)
  10. javascript中insertRow(index) 和insertCell(index)
  11. 南京大学人工智能学院教授俞扬:我的牛年小结
  12. 理论小知识:字符串mset命令
  13. 华为存储发展史:从筚路蓝缕到星辰大海
  14. C/C++实现matlab的imfill()函数
  15. 我们将与操作系统工作谈一场无私的爱──《云情人》思考
  16. ECMAScript 6 简明教程
  17. 2023年4月14日,open ai 还是能接收到短信验证码
  18. 登录注册的测试点分析
  19. 基于HTML+CSS绘制520情人节爱心飘落动画
  20. 东北林业大学Acm培训大一(三)(暴力枚举)

热门文章

  1. 使用Altium Designer绘制一个STM32系统的电路原理图
  2. java applet eclipse_在JDK和Eclipse下如何编写和运行Java Applet
  3. 使用脚本巧解office安装源问题(修正版)
  4. USB设备及硬盘自动运行病毒免疫工具
  5. 如何实现100家快递单轨迹推送?
  6. 《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair
  7. Badboy测试工具的使用教程
  8. Github开源项目详解--Mall(一)
  9. 华为盒子EC6110-T_悦me高安版_线刷固件(通刷版)
  10. 安装wireshark显示npcap失败的解决办法