设计模式3--抽象工厂模式(Abstract Factory)

来源:互联网 发布:注册表编辑器删除软件 编辑:程序博客网 时间:2024/06/06 00:28
抽象工厂模式的本质:选择产品簇的实现
package com;public interface CPUApi {void calculate();}
package com.impl;import com.CPUApi;public class CPUImplA implements CPUApi {    private int pins;    public CPUImplA(int pins) {super();this.pins = pins;}public int getPins() {return pins;}public void setPins(int pins) {this.pins = pins;}@Overridepublic void calculate() {System.out.println("我是A的CPU,针数是:" + pins);}}
package com.impl;import com.CPUApi;public class CPUImplB implements CPUApi {    private int pins;      public CPUImplB(int pins) {super();this.pins = pins;}public int getPins() {return pins;}public void setPins(int pins) {this.pins = pins;}@Overridepublic void calculate() {System.out.println("我是B的CPU,针数是:" + pins);}}
package com;public interface MainBoardApi {void installCPU();}
package com.impl;import com.MainBoardApi;public class MainBoardImplA implements MainBoardApi {    private int holes;    public MainBoardImplA(int holes) {super();this.holes = holes;}public int getHoles() {return holes;}public void setHoles(int holes) {this.holes = holes;}@Overridepublic void installCPU() {System.out.println("我是A的主板,孔数是:" + holes);}}
package com.impl;import com.MainBoardApi;public class MainBoardImplB implements MainBoardApi {    private int holes;    public MainBoardImplB(int holes) {super();this.holes = holes;}public int getHoles() {return holes;}public void setHoles(int holes) {this.holes = holes;}@Overridepublic void installCPU() {System.out.println("我是B的主板,孔数是:" + holes);}    }
import com.CPUApi;import com.MainBoardApi;public abstract class AbstractFactory {public abstract CPUApi getCPU();public abstract MainBoardApi getMainBoard();}
import com.CPUApi;import com.MainBoardApi;import com.impl.CPUImplA;import com.impl.MainBoardImplA;public class FactoryA extends  AbstractFactory{@Overridepublic CPUApi getCPU() {return new CPUImplA(776);}@Overridepublic MainBoardApi getMainBoard() {return new MainBoardImplA(776);}}
import com.CPUApi;import com.MainBoardApi;import com.impl.CPUImplB;import com.impl.MainBoardImplB;public class FactoryB extends  AbstractFactory{@Overridepublic CPUApi getCPU() {return new CPUImplB(1024);}@Overridepublic MainBoardApi getMainBoard() {return new MainBoardImplB(1024);}}
import com.CPUApi;import com.MainBoardApi;public class ComputerEngineer {CPUApi cpu = null;MainBoardApi  mainBoard = null;public void makeComputer(String schema) {// 1 准备硬件prepareHardwares(schema);// 2 组装电脑// 3 测试// 4 交付客户}private void prepareHardwares(String schema){if("A".equals(schema)){cpu = new FactoryA().getCPU();mainBoard = new FactoryA().getMainBoard();}else if("B".equals(schema)){cpu = new FactoryB().getCPU();mainBoard = new FactoryB().getMainBoard();}cpu.calculate();mainBoard.installCPU();}}
public class Client {public static void main(String[] args){ComputerEngineer e = new ComputerEngineer();e.makeComputer("A");}}

1 抽象工厂模式的本质工厂方法是选择单个产品的实现,虽然一个类里面可以有多个工厂方法,但是这些方法之间一般是没有联系的,即使看起来像有联系。

   但是抽象工厂着重的就是为一个产品簇选择实现,定义在抽象工厂里面的方法通常是有联系的,它们是产品的某一部分或者相互依赖的。如果抽象工厂里面只定义一个方法,直接创建产品,那么就退化称为工厂方法了。

2 何时选用抽象工厂模式

  1 如果希望一个系统独立于它的产品创建、组合和表示的时候。换句话说,希望一个系统只知道产品的接口,而不关心实现的时候。

  2 如果一个系统要有多个产品系列中的一个来配置的时候,换句话说,就是可以动态地产品簇的时候。

  3 如果要强调一系列相关产品的接口,以便联合使用它们的时候。