首先说明,文章较长,保证你有耐心看完肯定能懂,没耐心直接点×即可。
抽象工厂模式,是创建型设计模式之一。抽象型工厂模式适合产品确定,产品线不确定的类型,怎么讲?通过一个具体例子来讲一下吧。例如某电脑厂商要生产电脑,也就是电脑这个产品确定,而电脑配置不确定,这种情况可以用抽象工厂模式来解决。类图如图所示:
代码实现完全结合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();
}
下面是具体产品,CPU的I3(对应UML类图中的ProductA1):
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处理器");
}
}
具体产品,主板 联想主板(对应UML类图中的ProductB1):
package com.factory.demo;
public class LenovoMainBoard implements MainBoard {
@Override
public void mainboard() {
System.out.println("华硕主板");
}
}
具体产品,主板 华硕主板(对应UML类图中的ProductB2):
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("金士顿内存");
}
}
具体工厂类1,Computer1继承抽象工厂类(对应UML类图中的Factory1):
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处理器");
}
}
然后是具体工厂类3,Computer3继承抽象工厂类(对应UML类图中的Factory3):
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();
}
}
测试类增加Computer3的代码,增加后如下:
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();
}
}
运行实例如下:
可以看出来扩展生产线变得很容易,系统扩展性大大增强。
喜欢的朋友关注我。