1、什么是工厂方法
工厂方法模式(Factory Method),又称多态性工厂模式,属于设计模式三大分类中的创建型模式
,作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类。如类图所示:
在工厂模式中,核心的工厂类不再负责所有的产品的创建,而是将具体的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品应当被实例化这种细节。
2、工厂方法优缺点
- 优点:用户只需要关系所需产品对应的工厂,无须关心创建细节;加入新产品符合开闭原则,提高可扩展性。
- 缺点:类的个数容易过多,增加复杂度;增加了系统的抽象性和理解难度。
工厂方法模式非常符合“开闭原则”,当需要增加一个新产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必就会导致系统的复杂度增加。
3、代码实现
此处举一个画形状的例子,有圆和矩形两种,如代码(形状部分):
public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("画一个圆"); } } public class Rectangle implements Shape { @Override public void draw() { System.out.println("画一个矩形"); } }
代码(工厂部分):
public abstract class ShapeFactory { public abstract Shape getShape(); } public class CircleFactory extends ShapeFactory { @Override public Shape getShape() { return new Circle(); } } public class RectangleFactroy extends ShapeFactory { @Override public Shape getShape() { return new Rectangle(); } }
4、工厂方法模式的应用场景
工厂方法模式通常适用于以下场景。
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌。
5、工厂方法模式的扩展
当需要生成的产品不多且不会增加,一个具体工厂类就可以完成任务时,可删除抽象工厂类。这时工厂方法模式将退化到简单工厂模式,其结构图如图所示: