概念
定义一个用于创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使一个类的实例化延迟到子类进行。
应用场景
- 作为一种创建类模式,在任何需要生成复杂对象的地方,都可使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度
- 工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度
- 由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装
适用性
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
结构与参与者
Product:定义工厂方法所创建的对象的接口
ConcreteProduct:实现Product接口
Creator:核心类,用来声明工厂方法,该方法返回一个Product类型的对象
ConcreteCreator:重定义工厂方法以返回一个ConcreteCreator实例
优缺点
- 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
- 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
- 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。
遵循的设计原则
开放-封闭原则:其实它是将判断工作转移到了客户端调用之处,这样保证了工厂体系的完整性。而简单工厂模式需要在工厂类里来判断选择哪个运算类。
代码实现
接口类:Shape.java
public interface Shape {
public void draw();
}
具体实现类:Rectangle.java
& Square.java
& Circle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
工厂接口类:ShapeFactory.java
public interface ShapeFactory{
public Shape productShape();
}
具体工厂实现类:
RectangleFactory.java
public class RectangleFactory implements ShapeFactory{
public Shape productShape(){
return new Rectangle();
}
}
SquareFactory.java
public class SquareFactory implements ShapeFactory{
public Shape productShape(){
return new Square();
}
}
CircleFactory.java
public class CircleFactory implements ShapeFactory{
public Shape productShape(){
return new Circle();
}
}
参考资料
Design Pattern Quick Guide
Factory Method
23种设计模式(2):工厂方法模式
Design Pattern: factory patterns
工厂方法模式