网站首页 > java教程 正文
工厂模式是我们最常用的实例化对象模式了,目的是使用工厂方法代替一系列的new操作。
在开发当中,最常用的操作莫过于使用new来新建一个对象了,但是一些情况下会带来一些问题。举例说,许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
问题:如何能轻松方便地创建对象,而让client不关心对象创建的过程呢?
解决方案:使用工厂模式,创建一个工厂类来负责创建对象。
工厂模式是为创建对象提供过渡窗口,以便将对象的创建具体过程隔离开来,达到提高灵活性的目的。
工厂模式可以分为三种:
简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
GoF在《设计模式》书中将工厂模式分为工厂方法模式和抽象工厂模式,将简单工厂模式视为工厂方法模式的一种特例。
区别主要在工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个,工厂方法模式的具体工厂类只能创建一个具体产品类实例,而抽象工厂模式可以创建多个。
下面就工厂模式中的三种模式一一介绍一遍。
1.简单工厂模式
需求:纯属虚构,某用户要买宝马车,一般情况下,卖家会直接生产一辆宝马车给用户。后来卖家生意多了,就建了个工厂,专门用来生产宝马车,只要用户有需求,卖家就让工厂生产,即工厂可以创建各种对象,关系图如下:
java代码实现:
这是产品类接口,所有具体型号的宝马车都实现了这个接口。
这是三个具体型号的宝马车产品类。
这是宝马车型号类型枚举,客户根据这个选择具体型号。
这是工厂类,本模式的核心类实现。
这是客户端实现,只需要传入具体型号,就能得到对应的车辆,不需要关心对象的创建过程。
运行结果如下:
简单工厂模式又成为静态工厂模式,主要是定义了一个用于创建对象的接口。
我们举的例子很简单,也许有人发现了,如果我要生产其他型号的宝马车,就必须得修改工厂类,新增一个case,这明显违背了六大设计原则中的开闭原则,这对于代码设计是一件大忌,于是工厂方法模式就是诞生了。
2.工厂方法模式
需求:用户越来越多,不同用户的需求也不一样,现有的几个型号满足不了所有的用户,但是在简单工厂模式基础上,要新加型号,必须修改原来的工厂模式,违背了开闭原则,于是就想着如果针对不同的型号建立不同的工厂,每个工厂只生产对应型号的车。
关系图如下:
由上图可知,工厂方法模式在简单工厂模式的基础上,增加了Abstract Factory类,派生了BWM320Factory、BWM523Factory、BWM730Factory三个工厂类,各工厂类都实现了createBWM()方法用于生产对应型号的宝马车,客户端在直接调用具体型号的工厂类的生产方法即可,当要新增车辆型号时,新增一个具体型号产品类和一个具体工厂类即可,完美符合开闭原则。
下面看java代码实现:
这是抽象工厂类。
以上分别是具体型号的工厂类。
这是客户端。
具体产品类不变,可以很清晰的看出来跟简单工厂模式的区别,对于程序的扩展更开放了,但是同时引入了更多的类,当产品类越来越多,工厂类也会越来越多。
今天先介绍前两种,抽象工厂模式下篇再介绍。
- 上一篇: 「干货」详解java单例模式与工厂模式
- 下一篇: 快速带你彻底弄懂23种设计模式-工厂方法模式
猜你喜欢
- 2024-10-23 Java的简单工厂模式(java简单工厂模式实验总结)
- 2024-10-23 Java开发篇——设计模式(3)面试被问工厂模式?不要怕看这里
- 2024-10-23 架构师成长之路:Java设计模式之工厂模式
- 2024-10-23 Java的设计模式(十一):三种工厂模式区别,SpringBoot中的运用
- 2024-10-23 Java——工厂方法模式(java的工厂模式是什么意思啊)
- 2024-10-23 Java编程细节——设计模式之工厂模式
- 2024-10-23 Java之工厂方法(Factory Method)(java工厂模式的应用场景)
- 2024-10-23 Java工厂设计模式学习笔记(详细总结)
- 2024-10-23 教你轻松学Java开发23种设计模式 --工厂设计模式
- 2024-10-23 java设计模式-创建者模式-工厂模式
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)