首先,简单工厂:
public class SimplePhoneFactory { public static Cellphone getCellphone(String type){ if("iPhone".equals(type)){ return new IPhone(); }else if("Samsung".equals(type)) { return new Samsung(); }else { throw new RuntimeException("没有正确的手机类型创建"); } } }
工厂方法:
/* 工厂方法接口 */ public interface PhoneFactory { public Cellphone getPhone(); }
/* * @Description: iPhone 工厂 */ public class IPhoneFactory implements PhoneFactory{ @Override public Cellphone getPhone() { // TODO Auto-generated method stub return new IPhone(); } }
/* * @Description:samsung工厂 */ public class SamsungPhoneFactory implements PhoneFactory{ @Override public Cellphone getPhone() { // TODO Auto-generated method stub return new Samsung(); } }
以上代码可以看出,每个产品都需要自己的实现工厂,这时如果我们需要新增加新产品,比如小米手机,只需要新增一个MIPhoneFactory来实现PhoneFactory即可。
抽象工厂:
public interface CPU { void run(); void start(); } //高端CPU class GoodCUP implements CPU{ @Override public void run() { System.out.println("高端CPU运转方法。。。"); } @Override public void start() { System.out.println("高端CPU开始方法。。。"); } } //低端CPU class BadCPU implements CPU{ @Override public void run() { System.out.println("低端CPU运转方法。。。"); } @Override public void start() { System.out.println("低端CPU开始方法。。。"); } }
然后是相机接口,以及相关的相机生产类型,其中的方法是随便写的。
public interface Camera { public void take(); } class GoodCamera implements Camera{ @Override public void take() { System.out.println("高端相机拍照。。。"); } } class BadCamera implements Camera{ @Override public void take() { System.out.println("低端相机拍照。。。"); } }
最后一个内存的接口已经一系列类型:
public interface Memory { void work(); } class GoodMemory implements Memory{ @Override public void work() { System.out.println("高性能内存工作"); } } class BadMemory implements Memory{ @Override public void work() { System.out.println("低性能内存工作"); } }
我们前面说了,抽象工厂就是利用一些列组件组合产品的工厂,上面我们写的CPU,相机,内存都是我们要组件手机的组件。现在,我们开始写我们的抽象工厂。当然为了方便,肯定要有工厂接口:
public interface AbPhoneFactory { CPU getCPU(); Camera getCamera(); Memory getMemory(); }
然后,我们根据自己的需要,随机组合几种组件,即可得到我们的产品,当然这是一组(产品)组合出来的最终产品。
比如我们用好的CPU,好的内存,好的相机组合成一个好的手机:
public class GoodsPhoneFactory implements AbPhoneFactory{ @Override public CPU getCPU() { // TODO Auto-generated method stub return new GoodCUP(); } @Override public Camera getCamera() { // TODO Auto-generated method stub return new GoodCamera(); } @Override public Memory getMemory() { // TODO Auto-generated method stub return new GoodMemory(); } }
也可以用差的CPU,差的内存,差的相机组合成比较差劲的手机:
public class BadPhoneFactory implements AbPhoneFactory{ @Override public CPU getCPU() { // TODO Auto-generated method stub return new BadCPU(); } @Override public Camera getCamera() { // TODO Auto-generated method stub return new BadCamera(); } @Override public Memory getMemory() { // TODO Auto-generated method stub return new BadMemory(); } }
当然你也可以乱组合成中等的,这都是随你便了,只要加一个工厂实现即可。
最后,我们来总结一下吧:
对于单一产品,简单工厂更简单,但是新增产品时却很乏力,或者说不符合设计原则,而工厂方法是不修改原有类的前提下,新增工厂类实现,更符合设计原则。是不是我们在单一产品的时候就该选择工厂方法了呢?下面给出这么一个对比:
-- 结构复杂度 简单工厂更加简单 简单工厂优于工厂方法
-- 代码复杂度 工厂方法复杂度较高 简单工厂优于工厂方法
-- 客户端编程难度 工厂方法客户端需要了解更多的实现工厂 简单工厂优于工厂方法
-- 管理难度 工厂方法由于实现工厂类较多,管理更难 简单工厂优于工厂方法
结合以上四点,我们说简单工厂比工厂方法更加易用。这也就是开发时候简单工厂比工厂方法使用的更多的原因。
对于产品族,如果使用工厂模式,唯一的选择--抽象工厂。
OK,更多详细代码和本次测试代码请参考github:https://github.com/LiuJishuai/designPatterns。