简介
作用:
创建者和调用者分离
分类:
简单工厂模式
用来生成同一等级结构中的任意产品(对于增加新的产品,需扩展原有代码)
扩展原有代码:不满足开闭原则
工厂方法模式
用来生成同一等级结构中的固定产品(支持增加任意产品)
满足开闭原则
抽象工厂模式(本篇不介绍)
- 围绕一个简单工厂创建其他工厂,该超级工程又称其他工厂的工厂
引例
场景:消费者买车!
1.写一个Car的接口,定义车的规范,如何造车。
2.实现了Car接口的类就是车。
1.Car接口
public interface Car {
void getName();
}
2. 有两辆车
public class AE86 implements Car{
@Override
public void getName() {
System.out.println("AE86...");
}
}
public class Tesla implements Car {
@Override
public void getName() {
System.out.println("Tesla...");
}
}
3. 消费者买车
public class Consumer {
public static void main(String[] args) {
Car ae86 = new AE86();
Car tesla = new Tesla();
ae86.getName();
tesla.getName();
}
}
这样就实现了消费者买车!
但是,从上面例子可以看出一个问题,消费者买车的时候,车都需要自己造(new),这显然不合理!
(new 一辆车就是造一辆车,可能还需要很多参数,如果消费者买一辆车还需要知道车怎么造的,那显然不符合事实)
消费者买车,希望直接就能买到造好的车(不需要自己new),所以这需要一个中介,这个中介就是工厂
买车流程图
简单工厂模式
需要建一个车工厂来造车
1.车工厂
public class CarFactory {
public static Car getCar(String car){
if(car.equals("AE86")){
return new AE86();
}else if(car.equals("Tesla")){
return new Tesla();
}else {
return null;
}
}
}
2.消费者买车
public class Consumer {
public static void main(String[] args) {
//简单工厂
Car ae86 = CarFactory.getCar("AE86");
Car tesla = CarFactory.getCar("Tesla");
ae86.getName();
tesla.getName();
}
}
有了车工厂,消费者只需要告诉车工厂要什么车就能买到了,而再也不用自己造了!
买车流程图
但是,在加入新产品的车后,车工厂的代码也要做相应的修改(例如增加if语句)。这显然违背了开闭原则
简单工厂方法也称静态工厂方法
所以接下来介绍一种新的方法
工厂方法
为了满足开闭原则,所以有了工厂方法,但同时需要付出一定的代价!
1.先把车工厂抽象化
public interface CarFactory {
Car getCar();
}
2.每一款车对应一个工厂
public class AE86Factory implements CarFactory {
@Override
public Car getCar() {
return new AE86();
}
}
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
3.消费者买车
public class Consumer {
public static void main(String[] args) {
//工厂方法
Car ae86 = new AE86Factory().getCar();
Car tesla = new TeslaFactory().getCar();
ae86.getName();
tesla.getName();
}
}
现在扩展一辆车,只需要写一个实现Car接口类的车,再写一个该车对应的工厂。满足了开闭原则
买车流程图
总结
虽然工厂方法满足了开闭原则,但对于每次扩展,都需要增加更多的类。这也不是很好的选择
对比:
比较 | 选择 |
---|---|
结构复杂度 | 简单工厂更佳 |
代码复杂度 | 简单工厂更佳 |
编程复杂度 | 简单工厂更佳 |
管理上的复杂度 | 简单工厂更佳 |
根据设计原则 | 工厂方法更佳 |
选择 | |
-------------- | ------------ |
结构复杂度 | 简单工厂更佳 |
代码复杂度 | 简单工厂更佳 |
编程复杂度 | 简单工厂更佳 |
管理上的复杂度 | 简单工厂更佳 |
根据设计原则 | 工厂方法更佳 |
根据实际业务 | 简单工厂更佳 |