Java设计模式之工厂模式----简单工厂?抽象工厂?工厂方法?
一.我们说的设计模式指什么?
GoF(Gang of Four):是四个人的代号。
《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)被认为是关于设计模式的经典和权威
介绍:设计模式(豆瓣)
GoF的23种设计模式总结:
- 简单工厂并不是一种标准的设计模式
- 工厂方法模式和抽象工厂模式都是标准设计模式,而且属于创建型模式
二.简单工厂模式
1.定义:
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
2.UML类图
解释:简单工厂模式一般都会有一个SimpleFactory类,这个类中有一个create方法,根据传入参数也就是类型的不同返回不同的实例。
3.优缺点:
优点
- 简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。
- 客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可!
- 在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性
缺点
- 工厂类的职责过重,从类图中可以看出简单工厂中包含加减乘除的逻辑判断语句,它一旦有问题,整个系统都要出问题
- 在添加新的类的时候,例如我添加了开根号运算,那么系统中的简单工厂类就要修改,违反了开放——封闭原则!这样及其不利于系统的扩展和维护!
- 简单工厂的静态方法,使得工厂角色无法形成基于继承的等级结构!
二.工厂方法模式
1.定义:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
2.UML类图
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。创建的时候直接创建 Factory f = new AFactory();即可
3.优缺点:
优点
- 工厂方法用来创建客户所需要的产品,同时隐藏了哪种具体产品类将被实例化的细节,用户只需要要关注工厂,不需要关注创建的细节,只知道对应的工厂的名字就好!
- 在增加修改新的运算类的时候不用修改代码,只需要增加对应的工厂就好,完全符合开放——封闭性原则!
- 创建对象的细节完全封装在具体的工厂内部,而且有了抽象的工厂类,所有的具体工厂都继承了自己的父类!完美的体现了多态性
缺点
- 在增加新的产品(对应UML图的算法)时,也必须增加新的工厂类,会带来额外的开销
- 抽象层的加入使得理解程度加大
三.抽象工厂模式
1.定义:
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线(产品族)很容易,但是无法增加新的产品。
2.UML类图
四.区别
- 简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
- 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 抽象工厂:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)