抽象工厂模式的本质:选择产品簇的实现
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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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{
@Override
public CPUApi getCPU() {
return new CPUImplA(776);
}
@Override
public 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{
@Override
public CPUApi getCPU() {
return new CPUImplB(1024);
}
@Override
public 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 如果要强调一系列相关产品的接口,以便联合使用它们的时候。