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;
    //...
}