对于工厂模式大家都是耳熟能详的,但是发现大家对工厂模式的叫法比较混乱,我先明确一下概念。工厂模式分为“工厂方法模式”和“抽象工厂模式”,此两种模式是属于Gof23种经典设计模式的。平时大家所说的“工厂模式“其实就是指“工厂方法模式”,工厂方法模式还可以退化为“简单工厂模式”,“简单工厂模式”并不属于Gof23中经典设计模式。本文将介绍工厂方法模式。
一.定义
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
二.特点
具体产品和具体工厂一 一对应
三.优缺点
1:优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则
2:缺点
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
四.注意点
复杂对象适合使用工厂方法模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂方法模式,如果使用工厂方法模式,就需要引入一个工厂类,会增加系统的复杂度。
五.使用场景
1:客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
2:创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
3:客户不关心创建产品的细节,只关心产品的品牌。
六.结构
1、该模式的主要角色如下:
- 抽象工厂:提供创建产品的接口,调用者通过它访问具体工厂的工厂方法创建产品
- 具体工厂:实现抽象工厂的方法,完成具体产品的创建
- 抽象产品:定义产品的规范,描述了产品的主要特征和功能
- 具体产品:实现抽象产品定义的功能
2、结构图如下:
七.实现
步骤1:创建抽象类:Car
步骤2:创建子类BMW、Audi
步骤3:创建抽象工厂:CarFactory(此处采用接口实现)
步骤4:创建具体工厂:奥迪工厂(AudiFactory)和宝马工厂(BMWFactory)
步骤5:客户端代码
1、张三想买奥迪,那么就通过奥迪工厂来生产车
2、李四想买白马,那么就通过宝马工厂来生产车
步骤6:客户端代码
运行代码,查看结果,奥迪工厂生产了一辆奥迪,宝马工厂生产了一辆宝马。
八.总结
1:工厂方法模式是满足开闭原则的。
2:如果创建的对象简单,则不必使用工厂模式。
3:产品和工厂是一 一对应的。
4:当需要生成的产品不多且不会增加,一个具体工厂类就可以完成任务时,可删除抽象工厂类。这时工厂方法模式将退化到简单工厂模式。