工厂方法模式(Factory Method Pattern)是比简单工厂要更加抽象,更容易扩展的『工厂』模式,工厂方法定义了一个创建对象的接口,但是并不具体去处理创建对象的事情,而是通过实现此创建对象接口的类来创建对象。
我们来举个例子看一下,UML图如下所示:
Phone是抽象的手机类,Mi、Huawei、Oppo是具体的手机。
有一个生产手机的工厂接口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接口的实现类即可,不用修改原有代码。
缺点: 新增加产品的时候要创建一个新的具体产品生产类,这样随着产品的增加,会增加很多类。