背景介绍
前面我们介绍了简单工厂,知道了可以通过简单工厂来获得想要的单个产品。那如果我们想要获的是一系列或者相互依赖对象的对象呢?这个时候就需要一个功能更加强大的工厂——抽象工厂。
示例
还是通过例子来做说明,这个例子是一个客户请求工程师帮忙组装电脑。同时为了突出学习重点,这个电脑只有cpu 和 主板。主要是用来学习设计模式嘛!这个工程师有两套装机方案供客户选择。
由于代码全部贴出来,可能较长。为了行文紧凑,便只将与本文学习相关的代码贴出来,详细代码见 设计模式代码请戳这里
1. 定义接口
public interface AbstractFactory
{
public CPUApi createCpu();
public MainBoardApi createMainBoard();
}
public interface CPUApi
{
public void showID();
public void calculate();
}
public interface MainBoardApi
{
public void showID();
public void installCpu();
}
2. 根据接口分别实现两种型号的CPU和主板,以及供客户选择的两套方案
public class AMDCpu implements CPUApi
{
@Override
public void showID() {
System.out.println("this is AMD cpu"+this.getClass().getName());
}
@Override
public void calculate() {
System.out.println("AMD calculates good!");
}
}
public class IntelCpu implements CPUApi
{
@Override
public void showID() {
System.out.println("this is intel cpu");
}
@Override
public void calculate() {
System.out.println("intel calculates good!");
}
}
public class GAMainBoard implements MainBoardApi
{
@Override
public void showID() {
System.out.println("this is GA" + this.getClass().getName());
}
@Override
public void installCpu() {
System.out.println("cpu is installed");
}
}
public class MSIMainBoard implements MainBoardApi
{
@Override
public void showID() {
System.out.println("this id msi" + this.getClass().getName());
}
@Override
public void installCpu() {
System.out.println("cpu is installed");
}
}
public class Schema1 implements AbstractFactory
{
@Override
public CPUApi createCpu() {
return new IntelCpu();
}
@Override
public MainBoardApi createMainBoard() {
return new GAMainBoard();
}
}
public class Schema2 implements AbstractFactory
{
@Override
public CPUApi createCpu() {
return new AMDCpu();
}
@Override
public MainBoardApi createMainBoard() {
return new MSIMainBoard();
}
}
3. 实现装机工程师
public class ComputerEngineer
{
public void makeComputer(){
Schema1 schema1 = new Schema1();
prepareHardwares(schema1);
}
public void prepareHardwares(AbstractFactory schema){
CPUApi cup = schema.createCpu();
MainBoardApi mainBoard = schema.createMainBoard();
System.out.println("方案一:");
cup.showID();
mainBoard.showID();;
}
}
3. 客户端调用
public class Client
{
public static void main(String[] args) {
ComputerEngineer engineer = new ComputerEngineer();
engineer.makeComputer();
}
}
抽象工厂总结
简单工厂生产单个组件,而抽象工厂生成一系列组件,通常组件具有一定的联系。