一、工厂模式(Factory)

1、实现了创建者和调用者的分离

2、应用场景

①JDK中 Calendar 的 getInstance();

②JDBC 的 Connection 对象的获取;

③Hibernate 的 SessionFactory 创建 Session 对象;

④Spring 的 IOC 容器创建管理 Bean 对象;

⑤XML 的解析时 DocumentBuilderFactory 创建解析器对象;

⑥反射中 Class 对象的 newInstance()。

3、分类:

①简单工厂模式(也叫静态工厂模式,经常使用)

1、用来生产同一等级结构中的任意产品;

2、对于新增的产品,需要修改已有的代码。

3、不满足开闭原则(对扩展开放,对修改关闭)

②工厂方法模式

1、用来生产同一等级结构中的固定产品;

2、支持增加任意产品。

3、支持开闭原则(对扩展开放,对修改关闭)。

③抽象工厂模式

1、用来生产不同产品族的全部产品;

2、增加新的产品(一个),无能为力;

3、支持增加产品族。

二、工厂模式的代码实现

1、简单工厂模式

1.1、简单工厂模式产品的接口: Car.java

1 packagecn.com.zfc.gof01.factory.simplefactoy;2

3 /**

4 *5 * @title Car6 * @describe 简单工厂模式产品的接口 Car7 *@author张富昌8 * @date 2017年4月4日下午8:44:429 */

10 public interfaceCar {11   public abstract voidrun();12

13 }

1.2、简单工厂模式产品接口 Car 的实现类: Audi.java

1 packagecn.com.zfc.gof01.factory.simplefactoy;2

3 /**

4 *5 * @title Audi6 * @describe 简单工厂模式产品接口 Car 的实现类: Audi.java7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Audi implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("奥迪在行驶");15 }16

17 }

1.3、 简单工厂模式产品接口 Car 的实现类 :Benz.java

1 packagecn.com.zfc.gof01.factory.simplefactoy;2

3 /**

4 *5 * @title Benz6 * @describe 简单工厂模式产品接口 Car 的实现类: Benz.java7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Benz implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("奔驰在行驶");15 }16

17 }

1.4、简单工厂模式产品接口 Car 的实现类:Bmw.java

1 packagecn.com.zfc.gof01.factory.simplefactoy;2

3 /**

4 *5 * @title Bmw6 * @describe 简单工厂模式产品接口 Car 的实现类 Bmw7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Bmw implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("宝马在行驶");15 }16

17 }

1.5、简单工厂模式的工厂类:CarFactory.java

1 packagecn.com.zfc.gof01.factory.simplefactoy;2

3 /**

4 *5 * @title CarFactory6 * @describe 简单工厂,一般使用静态的方法7 *@author张富昌8 * @date 2017年4月4日下午8:50:089 */

10 public classCarFactory {11

12   //获取 Bmw 的实例

13   public staticCar getBmw() {14     return newBmw();15 }16

17   //获取 Benz 的实例

18   public staticCar getBenz() {19     return newBenz();20 }21

22   //获取 Audi 的实例

23   public staticCar getAudi() {24     return newAudi();25 }26

27 }

1.6、测试没有工厂类的前提下,创建 Audi、Benz、Bmw:TestNoFactory.java

1 packagecn.com.zfc.gof01.factory.simplefactoy.test;2

3 importcn.com.zfc.gof01.factory.simplefactoy.Audi;4 importcn.com.zfc.gof01.factory.simplefactoy.Benz;5 importcn.com.zfc.gof01.factory.simplefactoy.Bmw;6 importcn.com.zfc.gof01.factory.simplefactoy.Car;7

8 /**

9 *10 * @title TestNoFactory11 * @describe 没有工厂类,创建 Audi、Benz、Bmw12 *@author张富昌13 * @date 2017年4月4日下午8:52:3714 */

15 public classTestNoFactory {16   public static voidmain(String[] args) {17     //需要知道接口和其实现类

18     Car c1 = newAudi();19     Car c2 = newBenz();20     Car c3 = newBmw();21 c1.run();22 c2.run();23 c3.run();24 }25

26 }

1.7、测试在有工厂类的前提下,创建 Audi、Benz、Bmw:TestSimpleFactory.java

1 packagecn.com.zfc.gof01.factory.simplefactoy.test;2

3 importcn.com.zfc.gof01.factory.simplefactoy.Car;4 importcn.com.zfc.gof01.factory.simplefactoy.CarFactory;5

6 /**

7 *8 * @title TestSimpleFactory9 * @describe 测试简单工厂模式,有工厂类,创建 Audi、Benz、Bmw10 *@author张富昌11 * @date 2017年4月4日下午8:56:3912 */

13 public classTestSimpleFactory {14    public static voidmain(String[] args) {15     //需要知道接口和工厂类

16     Car c1 =CarFactory.getAudi();17     Car c2 =CarFactory.getBenz();18     Car c3 =CarFactory.getBmw();19 c1.run();20 c2.run();21 c3.run();22 }23 }

2、工厂方法模式

2.1、简单工厂模式产品的接口: Car.java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title Car6 * @describe 简单工厂模式产品的接口 Car7 *@author张富昌8 * @date 2017年4月4日下午8:44:429 */

10 public interfaceCar {11   public abstract voidrun();12 }

2.2、工厂方法模式产品接口 Car 的实现类 :Audi.java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title Audi6 * @describe 工厂方法模式产品接口 Car 的实现类 Audi7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Audi implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("奥迪在行驶");15 }16

17 }

2.3、工厂方法模式产品接口 Car 的实现类 Benz

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title Benz6 * @describe 工厂方法模式产品接口 Car 的实现类 :Benz.java7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Benz implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("奔驰在行驶");15 }16

17 }

2.4、工厂方法模式产品接口 Car 的实现类:Bmw.java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title Bmw6 * @describe 工厂方法模式产品接口 Car 的实现类 Bmw7 *@author张富昌8 * @date 2017年4月4日下午8:45:489 */

10 public class Bmw implementsCar {11

12 @Override13   public voidrun() {14     System.out.println("宝马在行驶");15 }16

17 }

2.5、工厂方法模式的工厂接口:CarFactory.java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title CarFactory6 * @describe 工厂方法模式的工厂接口 CarFactory7 *@author张富昌8 * @date 2017年4月4日下午9:05:189 */

10 public interfaceCarFactory {11 Car getCar();12 }

2.6、 工厂方法模式的工厂类,需要实现工厂接口:AudiFactory .java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title AudiFactory6 * @describe 工厂方法模式的工厂类,需要实现工厂接口7 *@author张富昌8 * @date 2017年4月4日下午9:07:089 */

10 public class AudiFactory implementsCarFactory {11

12 @Override13   publicCar getCar() {14     return newAudi();15 }16

17 }

2.7、工厂方法模式的工厂类,需要实现工厂接口:BenzFactory .java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title BenzFactory6 * @describe 工厂方法模式的工厂类,需要实现工厂接口7 *@author张富昌8 * @date 2017年4月4日下午9:07:089 */

10 public class BenzFactory implementsCarFactory {11

12 @Override13   publicCar getCar() {14     return newBenz();15 }16

17 }

2.8、工厂方法模式的工厂类,需要实现工厂接口:CarFactory .java

1 packagecn.com.zfc.gof01.factory.factorymethod;2

3 /**

4 *5 * @title BmwFactory6 * @describe 工厂方法模式的工厂类,需要实现工厂接口7 *@author张富昌8 * @date 2017年4月4日下午9:07:089 */

10 public class BmwFactory implementsCarFactory {11

12 @Override13   publicCar getCar() {14     return newBmw();15 }16

17 }

2.9、测试工厂方法模式:TestFactoryMethod.java

1 packagecn.com.zfc.gof01.factory.factorymethod.test;2

3 importcn.com.zfc.gof01.factory.factorymethod.AudiFactory;4 importcn.com.zfc.gof01.factory.factorymethod.BenzFactory;5 importcn.com.zfc.gof01.factory.factorymethod.BmwFactory;6 importcn.com.zfc.gof01.factory.factorymethod.Car;7

8 /**

9 *10 * @title TestFactoryMethod11 * @describe 测试工厂方法模式12 *@author张富昌13 * @date 2017年4月4日下午9:09:3414 */

15 public classTestFactoryMethod {16   public static voidmain(String[] args) {17     //需要知道接口和各自的工厂类

18     Car c1 = newAudiFactory().getCar();19     Car c2 = newBenzFactory().getCar();20     Car c3 = newBmwFactory().getCar();21 c1.run();22 c2.run();23 c3.run();24 }25 }

3、抽象工厂模式

3.1、抽象工厂的产品接口,发动机:Engine.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title Engine6 * @describe 抽象工厂的产品接口,发动机7 *@author张富昌8 * @date 2017年4月4日下午9:27:219 */

10 public interfaceEngine {11   //发动机效率

12   voidefficiency();13 }

3.2、抽象接口的产品接口,座位:Seat.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title Seat6 * @describe 抽象接口的产品接口,座位7 *@author张富昌8 * @date 2017年4月4日下午9:38:219 */

10 public interfaceSeat {11   //座位舒适

12   voidcomfort();13

14 }

3.3、抽象工厂的产品接口,轮胎:Tyre.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title Tyre6 * @describe 抽象工厂的产品接口,轮胎7 *@author张富昌8 * @date 2017年4月4日下午9:39:069 */

10 public interfaceTyre {11   //轮胎磨损

12   voidwear();13 }

3.4、抽象工厂模式的产品实现类,低端发动机:LowEngine.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2 /**

3 *4 * @title LowEngine5 * @describe 抽象工厂模式的产品实现类,低端发动机6 *@author张富昌7 * @date 2017年4月4日下午9:55:028 */

9 public class LowEngine implementsEngine {10

11 @Override12   public voidefficiency() {13     System.out.println("低端发动机工作效率低");14 }15

16 }

3.5、抽象工厂模式的产品实现类,高端发动机:LuxuryEngine.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title LuxuryEngine6 * @describe 抽象工厂模式的产品实现类,高端发动机7 *@author张富昌8 * @date 2017年4月4日下午9:48:059 */

10 public class LuxuryEngine implementsEngine {11

12 @Override13   public voidefficiency() {14     System.out.println("高端发动机工作效率高");15 }16

17 }

3.6、抽象工厂模式的产品实现类,低端座位:LowSeat.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title LowSeat6 * @describe 抽象工厂模式的产品实现类,低端座位7 *@author张富昌8 * @date 2017年4月4日下午9:55:329 */

10 public class LowSeat implementsSeat {11

12 @Override13   public voidcomfort() {14     System.out.println("低端座位舒适度低");15 }16

17 }

3.7、抽象工厂模式的产品实现类,高端座位:LuxurySeat.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2 /**

3 *4 * @title LuxurySeat5 * @describe 抽象工厂模式的产品实现类,高端座位6 *@author张富昌7 * @date 2017年4月4日下午9:55:498 */

9 public class LuxurySeat implementsSeat {10

11 @Override12   public voidcomfort() {13     System.out.println("高端座位舒适度高");14 }15

16 }

3.8、抽象工厂模式的产品实现类,低端轮胎:LowTyre.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2 /**

3 *4 * @title LowTyre5 * @describe 抽象工厂模式的产品实现类,低端轮胎6 *@author张富昌7 * @date 2017年4月4日下午9:55:408 */

9 public class LowTyre implementsTyre {10

11 @Override12   public voidwear() {13     System.out.println("低端轮胎易磨损");14 }15

16 }

3.9、抽象工厂模式的产品实现类,高端轮胎:LuxuryTyre.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2 /**

3 *4 * @title LuxuryTyre5 * @describe 抽象工厂模式的产品实现类,高端轮胎6 *@author张富昌7 * @date 2017年4月4日下午9:55:558 */

9 public class LuxuryTyre implementsTyre {10

11 @Override12   public voidwear() {13     System.out.println("高端轮胎不易磨损");14 }15

16 }

3.10、抽象工厂的产品族工厂接口:CarFactory.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title CarFactory6 * @describe 抽象工厂的产品族工厂接口7 *@author张富昌8 * @date 2017年4月4日下午9:54:289 */

10 public interfaceCarFactory {11 Engine getEngine();12

13 Seat getSeat();14

15 Tyre getTyre();16 }

3.11、抽象工厂的产品族工厂接口的实现类,低端工厂:LowCarFactory.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title LowCarFactory6 * @describe 抽象工厂的产品族工厂接口的实现类,低端工厂7 *@author张富昌8 * @date 2017年4月4日下午10:07:409 */

10 public class LowCarFactory implementsCarFactory {11

12 @Override13   publicEngine getEngine() {14     return newLowEngine();15 }16

17 @Override18   publicSeat getSeat() {19     return newLowSeat();20 }21

22 @Override23   publicTyre getTyre() {24     return newLowTyre();25 }26

27 }

3.12、抽象工厂的产品族工厂接口的实现类,高端工厂:LuxuryCarFactory.java

1 packagecn.com.zfc.gof01.factory.abstractfactory;2

3 /**

4 *5 * @title LuxuryCarFactory6 * @describe 抽象工厂的产品族工厂接口的实现类,高端工厂7 *@author张富昌8 * @date 2017年4月4日下午9:59:389 */

10 public class LuxuryCarFactory implementsCarFactory {11

12 @Override13   publicEngine getEngine() {14     return newLuxuryEngine();15 }16

17 @Override18   publicSeat getSeat() {19     return newLuxurySeat();20 }21

22 @Override23   publicTyre getTyre() {24     return newLuxuryTyre();25 }26

27 }

3.13、测试抽象工厂模式:TestAbstractFactory.java

1 packagecn.com.zfc.gof01.factory.abstractfactory.test;2

3 importcn.com.zfc.gof01.factory.abstractfactory.CarFactory;4 importcn.com.zfc.gof01.factory.abstractfactory.Engine;5 importcn.com.zfc.gof01.factory.abstractfactory.LuxuryCarFactory;6

7 /**

8 *9 * @title TestAbstractFactory10 * @describe 测试抽象工厂模式11 *@author张富昌12 * @date 2017年4月4日下午10:18:3913 */

14 public classTestAbstractFactory {15   public static voidmain(String[] args) {16     CarFactory carFactory = newLuxuryCarFactory();17     Engine engine =carFactory.getEngine();18 engine.efficiency();19 }20 }

java设计模式 gof_Java设计模式GOF之工厂模式相关推荐

  1. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  2. Java设计模式(二)简单工厂模式—设计模式六大原则

    文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...

  3. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式

    设计模式C#描述之--简单工厂模式 前 言:设计模式是软件开发领域的精髓之一.学好设计模式是目前每一个开发人员的必修课.目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并 不很适合初学者 ...

  4. 设计模式(1)--简单工厂模式、策略模式

    设计模式(1)--简单工厂模式.策略模式 1. 简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static ...

  5. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  6. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.简单工厂模式(Simple Factory Pattern)属于创建型模式.简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例, ...

  7. JAVA常用设计模式(一、单例模式、工厂模式)

    JAVA设计模式之单例模式 import java.util.HashMap; import java.util.Map;/*** 设计模式之单例模式* 单例模式(Singleton Pattern) ...

  8. Java设计模式(5):工厂模式

    5,工厂模式(Factory) 工厂模式在逻辑上可以分为三种:简单工厂模式,工厂方法模式和抽象工厂模式.其中简单工厂模式不属于23种设计模式. 从实际中理解三种工厂模式,大致可以理解为工厂发展的三个阶 ...

  9. Java 设计模式之 Abstract Factory 抽象工厂模式

    在工厂方法基础上,将工厂的生产方法的返回类型从具体产品抽象为抽象产品,同时扩展工厂的方法,支持任意定制产品族,则工厂方法可以升级为抽象工厂模式,比如一家餐厅可以提供牛排(方法A),红酒(方法B),蔬菜 ...

最新文章

  1. windows10下pip安装速度慢的解决办法
  2. pytorch 之手写数字生成网络
  3. JS组件系列——BootstrapTable 行内编辑解决方案:x-editable
  4. 处理图片(updated)
  5. Microsoft Azure云服务停机!系水泵未知原因关闭导致
  6. Linux 下 Redis 6 的安装使用(Ubuntu 18.04)
  7. MFC 操作配置文件INI的方法
  8. mac osx 10.10 pip 安装问题
  9. CCCC-GPLT L1-035. 情人节 团体程序设计天梯赛
  10. 浮点数不能全等比较吗php,php的一些易错知识点整理 | 木凡博客
  11. 50个常用的sql语句
  12. 三星samsung 3G手机s7220 小技巧
  13. 【STM32H7的DSP教程】第4章 Matlab简易使用之脚本文件
  14. Sopcast软件中凤凰卫视频道列表代码
  15. C# WPF仿360安全卫士11
  16. Android分屏显示
  17. 低学历者已经月入万元是为什么
  18. JS下载喜马拉雅非付费音频
  19. FTP服务器、部署YUM仓库与NFS共享服务
  20. daily reading

热门文章

  1. 台湾精锐APEX行星减速机行业应用案例
  2. Maven的Mirror的详细说明
  3. MMC、SD等存储卡的区别总结
  4. 数据库从入门到删库跑路(二) - - PL/SQL
  5. servlet生命周期:
  6. java计算机毕业设计中小企业人力资源管理系统源码+mysql数据库+系统+部署+lw文档
  7. 《国际服务贸易》期末复习题 及答案参考
  8. [Java]代码实现图像转换成文本
  9. 摄像头中 P 制和 N 制的区别
  10. 从头到脚撸一个多人视频聊天 — WebRTC 实战(一)