工厂方法模式(Factory Method Pattern)

152 阅读2分钟

工厂方法模式(Factory Method Pattern)是比简单工厂要更加抽象,更容易扩展的『工厂』模式,工厂方法定义了一个创建对象的接口,但是并不具体去处理创建对象的事情,而是通过实现此创建对象接口的类来创建对象。

我们来举个例子看一下,UML图如下所示:

image

Phone是抽象的手机类,MiHuaweiOppo是具体的手机。

有一个生产手机的工厂接口PhoneFactory,然后有三个实现了这个接口的具体工厂类:

  • MiPhoneFactory
  • HuaweiPhoneFactory
  • OppoPhoneFactory

下面看具体的代码:

抽象Phone

public abstract class Phone {
​
    protected String name;
​
    public Phone(String name) {
        this.name = name;
    }
​
    public String getName() {
        return this.name;
    }
}

小米手机类:Mi

public class Mi extends Phone {
    public Mi(String name) {
        super(name);
    }
}

华为手机类:Huawei

public class HuaWei extends Phone {
    public HuaWei(String name) {
        super(name);
    }
}

Oppo手机类:Oppo

public class Oppo extends Phone {
    public Oppo(String name) {
        super(name);
    }
}

然后是工厂,抽象工厂接口:

/**
 * 抽象的工厂接口
 */
public interface PhoneFactory {
    /**
     * 创建手机的method
     * @param name
     * @return
     */
    Phone createPhone(String name);
}

小米手机工厂

/**
 * 小米手机工厂
 */
public class MiPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone(String name) {
        return new Mi(name);
    }
}

华为手机工厂

/**
 * 华为手机工厂
 */
public class HuaWeiPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone(String name) {
        return new HuaWei(name);
    }
}

Oppo手机工厂

/**
 * Oppo手机工厂
 */
public class OppoPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone(String name) {
        return new Oppo(name);
    }
}

Client端:

public class ConsumerDemo {
​
    public static void main(String[] args) throws IOException {
​
        // 生产华为手机
        PhoneFactory huaWeiPhoneFactory = new HuaWeiPhoneFactory();
        Phone phone = huaWeiPhoneFactory.createPhone("华为");
        System.out.println(phone.getName());
​
        // 生产Oppo手机
        PhoneFactory oppoPhoneFactory = new OppoPhoneFactory();
        Phone oppo = oppoPhoneFactory.createPhone("Oppo");
        System.out.println(oppo.getName());
​
        // 生产小米手机
        PhoneFactory miPhoneFactory = new MiPhoneFactory();
        Phone mi = oppoPhoneFactory.createPhone("Mi");
        System.out.println(mi.getName());
    }
}

运行输出结果如下:

华为
Oppo
Mi

最后我们可以根据以上代码思考一下工厂方法模式的优缺点。

优点: 符合开闭原则,比简单工厂更容易扩展,新增一个产品的时候,只需要新增一个Factory接口的实现类即可,不用修改原有代码。

缺点: 新增加产品的时候要创建一个新的具体产品生产类,这样随着产品的增加,会增加很多类。