抽象工厂模式与工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
在什么情况下应当使用抽象工厂模式?
这个系统的产品有多于一个的产品族,而系统只选择消费其中某一族的产品。例如,组装电脑是用Inter的产品族还是用AMD的产品族,当选择其中一个品牌后,再确定用这个品牌下的组件,CPU、主板、显卡等来组装一台电脑。这就取决于实施人员在组装的时候设置参数来决定使用哪一个品牌。
同属于同一个产品族的产品是一起使用的,这一约束必须在系统的设计中体现出来。比如:Intel的产品是属于Intel产品族,而AMD的产品属于AMD产品族。将CPU和主板是这两个版本(产品族)拥有的产品,而抽象工厂有两个具体工厂实现类IntelFactory、AmdFactory负责分别创建Intel Cpu、Inter主版和AMDCPU和AMD主板。当用户需要组装电脑时,先需要选择是CPU和主板。当不使用抽象工厂可能会出现如下情况 :用户选择了Intel的CPU和AMD的主板。这两者插槽是不匹配的。这样就会出现问题。如果使用抽象工厂,那抽象工厂的具体实现类会帮你创建一个产品族中的一系列产品对象,如Intel工厂会创建IntelCpu和Intel主板,AMD工厂会创建AMDCPU和AMD主板。
其实抽象工厂就是起到了一定的约束作用,它所创建的都是同一个产品族中的一系列产品对象。防止出现上面例子中创建不同产品族中产品所带来的问题。创建CPU:
public interface Cpu { //计算方法 void calculate();}
public class IntelCpu implements Cpu { //cpu的针脚数 private int pins=0; public IntelCpu(int pins) { this.pins = pins; } @Override public void calculate() { System.out.println("Interl CPU的针脚数:"+pins); }}
public class AmdCpu implements Cpu { private int pins=0; public AmdCpu(int pins) { this.pins = pins; } @Override public void calculate() { System.out.println("AMD CPU的针脚数:"+pins); }}
创建主板
public interface Mainboard { //安装CPU方法 void instalCpu();}
public class IntelMainboard implements Mainboard { //cpu插槽的孔数 private int cpuHoles=0; public IntelMainboard(int cpuHoles) { this.cpuHoles = cpuHoles; } @Override public void instalCpu() { System.out.println("Intel主板的CPU插槽孔数是:"+cpuHoles); }}
public class AmdMainboard implements Mainboard { //cpu插槽的孔数 private int cpuHoles=0; public AmdMainboard(int cpuHoles) { this.cpuHoles = cpuHoles; } @Override public void instalCpu() { System.out.println("AMD主板的CPU插槽孔数是:"+cpuHoles); }}
工厂:
public interface AbstractFactory { Cpu createCpu(); Mainboard createMainboard();}
public class AmdFactory implements AbstractFactory { @Override public Cpu createCpu() { return new AmdCpu(938); } @Override public Mainboard createMainboard() { return new AmdMainboard(938); }}
public class IntelFactory implements AbstractFactory { @Override public Cpu createCpu() { return new IntelCpu(755); } @Override public Mainboard createMainboard() { return new IntelMainboard(755); }}
工程师
public class Engineer { //定义组装机需要的CPU private Cpu cpu=null; //定义组装需要的主板 private Mainboard mainboard=null; //组装电脑 public void makeComputer(AbstractFactory af){ //组装机器的基本步骤 prepareHardwares(af); } private void prepareHardwares(AbstractFactory af) { //直接找工厂获取 this.cpu=af.createCpu(); this.mainboard= af.createMainboard(); //测试配件是否可用 this.cpu.calculate(); this.mainboard.instalCPU(); }}
客户端
public class Client { public static void main(String[] args) { //创建装机工程师对象 Engineer engineer = new Engineer(); //客户选择并创建需要使用的产品对象 AbstractFactory af = new IntelFactory(); //告诉装机工程师自己选择的产品 engineer.makeComputer(af); }}