1. 工厂方法模式
1.1 介绍
上面提到的简单工厂模式为每种对象创建一个工厂,通过传入参数实现生产,但实际上这在一定程度上还存在调度和被调用之间的耦合,而工厂方法模式将工厂抽象化,通过在生产工厂类时就指定创建的对象,进一步降低了耦合,形成工厂—产品
一一对应的模式,因此满足了“开放-封闭”原则。
1.2 优缺点
优点
- 抽象工厂类通过其子类来指定创建哪个对象,在简单工厂的基础上进一步降低了耦合,并满足了开放—封闭原则
缺点
- 由于生产一种产品就要创建一个工厂类,比较复杂。
1.3 适用场景
1.4 注意事项
2. 案例实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lv27d6P3-1630411544923)(…/…/images/设计模式工厂方法模式.PNG)]
abstract class Car {
abstract String getName();
}
class Audi extends Car {
@Override
String getName() {
return "奥迪";
}
}
class BMW extends Car {
@Override
String getName() {
return "宝马";
}
}
abstract class CarFactory {
abstract Car getCar();
}
public class AudiFactory extends CarFactory {
@Override
Car getCar() {
return new Audi();
}
}
public class BMWFactory extends CarFactory {
@Override
Car getCar() {
return new BMW();
}
}
/**
* 工厂方法模式
* 继承抽象工厂来实现产品工厂,一个工厂可以生产一种产品
*
* @Author cly
* @Date 2021/08/31 0:22
* @Version 1.0
*/
public class FactoryMethod {
public static void main(String[] args) {
Car car = new BMWFactory().getCar();
System.out.println(car.getName());
}
}
3. 源码实现
3.1 Java中ArrayList中的iterator
其中Iterator是抽象产品,itr是具体产品,collection是抽象工厂,ArrayList是具体产品。
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
//...
}