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

抽象工厂模式的本质: 选择产品簇的实现
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 如果要强调一系列相关产品的接口,以便联合使用它们的时候。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值