工厂方法模式:定义一个建立对象的接口,但让实现这个接口的类来决定实例化哪一个类,也就是说工厂方法模式让实例化推迟到子类ide
应用场景:code
- 客户只知道建立产品的工厂名,而不知道具体的产品名
- 建立对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供建立产品的接口。
- 客户不关心建立产品的细节,只关心产品的品牌
工厂方法模式的组件:对象
- Factory(抽象工厂):提供了建立产品的接口,调用者经过它访问具体工厂的工厂方法来建立产品。
- ConcreteFactory(具体工厂):主要是实现抽象工厂中的抽象方法,完成具体产品的建立
- Product(抽象产品):定义了产品的规范,描述了产品的主要特性和功能
- ConcreteProduct(具体产品):实现了抽象产品角色所定义的接口,由具体工厂来建立,它同具体工厂之间一一对应
工厂方法模式组件示例:
抽象产品:接口
public interface Shape { void shapeDesc(); }
具体产品:产品
public class Circle implements Shape { @Override public void shapeDesc() { System.out.println("这是一个圆形"); } }
public class Rectangle implements Shape { @Override public void shapeDesc() { System.out.println("这是一个矩形"); } }
public class Square implements Shape { @Override public void shapeDesc() { System.out.println("这是一个正方形"); } }
抽象工厂:class
public interface Factory { Shape createShape(); }
具体工厂:方法
public class CircleFactory implements Factory { @Override public Shape createShape() { return new Circle(); } }
public class RectangleFactory implements Factory { @Override public Shape createShape() { return new Rectangle(); } }
public class SquareFactory implements Factory { @Override public Shape createShape() { return new Square(); } }
工厂方法模式总结:im
- 新增一种产品时,只须要增长相应的具体产品类和相应的工厂子类便可,更符合开-闭原则
- 每一个具体工厂类只负责建立对应的产品,更符合单一职责原则
- 若产品过多时,会致使系统类的个数将成对增长,在必定程度上增长了系统的复杂度