在上一节中,我们知道 简单工厂模式 违背了开闭原则,扩展新的产品时需要修改工厂类。工厂方法模式对简单工厂做了进一步的抽象,使得产生新产品时不需要对原代码进行改动,满足开闭原则。
应用场景
-
客户只知道创建产品的工厂名,而不知道具体的产品名。比如宝马车工厂,奔驰车工厂
-
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口
-
客户不关心创建产品的细节,只关心产品的品牌
优点
- 只需要知道具体工厂名就可得到所要的产品,无须关心产品的具体创建过程
- 满足开闭原则,增加新产品时只需要创建一个对应的工厂类
- 通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系
缺点
- 类的个数容易增加到很多,复杂度增加
- 一个工厂只能生成一种产品,可以使用 抽象工厂 来实现
类结构
Java实现示例
用工厂方法模式设计一个生成不同品牌车子的示例,可实现横向扩展新的品牌车而不用对原代码进行修改。
// 生成车工厂接口
public interface ICarFactory {
/** 车的制造方法 */
ICar create();
}
// 车的统一接口
public interface ICar {
/**
* 车子加油
*/
void addOil();
}
// 第一个品牌,宝马车
public class BMWFactory implements ICarFactory {
@Override
public ICar create() {
return new BMWCar();
}
}
public class BMWCar implements ICar {
@Override
public void addOil() {
System.out.println("BMW is adding oil..");
}
}
// 第二个品牌,桑塔纳车(小船同学的座驾)
public class STNFactory implements ICarFactory {
@Override
public ICar create() {
return new SangTaNa();
}
}
public class SangTaNa implements ICar {
@Override
public void addOil() {
System.out.println("SangTaNa is adding oil..");
}
}
// 使用示例
public static void main(String[] args) {
ICarFactory bmwFactory = new BMWFactory();
ICarFactory stnFactory = new STNFactory();
ICar bm = bmwFactory.create();
ICar stn = stnFactory.create();
bm.addOil();
stn.addOil();
}
// 运行结果
BMW is adding oil..
SangTaNa is adding oil..