工厂方法模式

痴心易碎 提交于 2020-03-04 21:16:44

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

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

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接口的实现类即可,不用修改原有代码。

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!