工厂方法模式(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接口的实现类即可,不用修改原有代码。
缺点:新增加产品的时候要创建一个新的具体产品生产类,这样随着产品的增加,会增加很多类。
来源:oschina
链接:https://my.oschina.net/mingshashan/blog/3188028