标签:
首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可。
抽象工厂模式,是创建型设计模式之一。抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧。例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决。类图如图所示:
代码实现完全结合UML类图,结合图就可以完成系统创建。
本实例里是抽象类ComputerFactory(对应UML类图中的AbstractFactory):
package com.factory.demo; public abstract class ComputerFactory { public abstract CPU createCPU(); public abstract MainBoard createMainBoard(); public abstract RAM createRAM(); }有三个方法,生产CPU,生产主板和生产内存。
产品抽象接口,CPU(对应UML类图中的ProductA):
package com.factory.demo; public interface CPU { void cpu(); }产品抽象接口,主板(对应UML类图中的ProductB):
package com.factory.demo; public interface MainBoard { void mainboard(); }产品抽象接口,内存((对应UML类图中的ProductC)):
package com.factory.demo; public interface RAM { void ram(); }
package com.factory.demo; public class I3CPU implements CPU { public void cpu() { System.out.println("i3处理器"); } }具体产品,CPU的I5(对应UML类图中的ProductA2):
package com.factory.demo; public class I5CPU implements CPU { public void cpu() { System.out.println("i5处理器"); } }
package com.factory.demo; public class LenovoMainBoard implements MainBoard { @Override public void mainboard() { System.out.println("华硕主板"); } }
package com.factory.demo; public class ASUSMainBoard implements MainBoard { @Override public void mainboard() { System.out.println("联想主板"); } }具体产品 内存 三星内存(对应UML类图中的ProductC1):
package com.factory.demo; public class SamsungRAM implements RAM { public void ram() { System.out.println("三星内存"); } }具体产品,内存 金士顿内存(对应UML类图中的ProductC2):
package com.factory.demo; public class KingStoneRAM implements RAM { public void ram() { System.out.println("金士顿内存"); } }
package com.factory.demo; public class Computer1 extends ComputerFactory { /** * 组装电脑1,用的i3处理器、联想的主板和三星的内存 * @return */ @Override public CPU createCPU() { return new I3CPU(); } @Override public MainBoard createMainBoard() { return new LenovoMainBoard(); } @Override public RAM createRAM() { return new SamsungRAM(); } }
具体工厂类2,Computer2继承抽象工厂类(对应UML类图中的Factory2):
package com.factory.demo; public class Computer2 extends ComputerFactory { /** * 组装电脑2,用的i5处理器、华硕的主板和金士顿的内存 * @return */ @Override public CPU createCPU() { return new I5CPU(); } @Override public MainBoard createMainBoard() { return new ASUSMainBoard(); } @Override public RAM createRAM() { return new KingStoneRAM(); } }这时创建一个测试类:
package com.factory.demo; public class TestFactory { public static void main(String[] args) { //电脑1 ComputerFactory computer1=new Computer1(); System.out.println("组装产品类型1:"); computer1.createCPU().cpu(); computer1.createMainBoard().mainboard(); computer1.createRAM().ram(); //电脑2 ComputerFactory computer2=new Computer2(); System.out.println("组装产品类型2:"); computer2.createCPU().cpu(); computer2.createMainBoard().mainboard(); computer2.createRAM().ram(); } }
总结一下:上面每一个类或接口都对应了UML类图中的每一个元素,可以参照UML类图构建系统。本系统好处是分离了接口和实现,实现产品下种类切换时十分灵活容易(也就是再制作一条产品Computer3的生产线很容易)。缺点也是显而易见,会造成类爆炸性增长可以参照下图:
还有一个缺点就是不容易增加其他产品类,增加一个产品类就需要修改抽象工厂,那么所有具体工厂类也必须被修改。
下面我们看一下如何增加一条Computer3的生产线:
Computer3的配置是i7 CPU+华硕主板+金士顿内存。这时我们首先要实现一个i7的CPU(对应UML类图中的ProductA3):
package com.factory.demo; public class I7CPU implements CPU { public void cpu() { System.out.println("i7处理器"); } }
package com.factory.demo; public class Computer3 extends ComputerFactory { /** * 组装电脑3,i7 CPU+华硕主板+金士顿内存 * @return */ @Override public CPU createCPU() { return new I7CPU(); } @Override public MainBoard createMainBoard() { return new ASUSMainBoard(); } @Override public RAM createRAM() { return new KingStoneRAM(); } }
package com.factory.demo; public class TestFactory { public static void main(String[] args) { //电脑1 ComputerFactory computer1=new Computer1(); System.out.println("组装产品类型1:"); computer1.createCPU().cpu(); computer1.createMainBoard().mainboard(); computer1.createRAM().ram(); //电脑2 ComputerFactory computer2=new Computer2(); System.out.println("组装产品类型2:"); computer2.createCPU().cpu(); computer2.createMainBoard().mainboard(); computer2.createRAM().ram(); //电脑3 ComputerFactory computer3=new Computer3(); System.out.println("组装产品类型3:"); computer3.createCPU().cpu(); computer3.createMainBoard().mainboard(); computer3.createRAM().ram(); } }
可以看出来扩展生产线变得很容易,系统扩展性大大增强。
喜欢的朋友关注我。
标签:
原文地址:http://blog.csdn.net/yayun0516/article/details/50821408