抽象工厂模式(Abstract Factory)

@@@模式定义:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

@@@练习示例: 
选择组装电脑的配件。

@@@示例代码:
src\computer\CPUApi.java

~~~~~~~~~~~~~~~~~~~~~~~~

package computer;
/**
 * CPU的接口
 */
public interface CPUApi {
    /**
     * 示意方法,CPU具有运算的功能
     */
	public void calculate();
}

src\computer\IntelCPU.java

~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * Intel的CPU实现
 */
public class IntelCPU implements CPUApi {
    /**
     * CPU的针脚数目
     */
	private int pins = 0;
	
	/**
	 * 构造方法,传入CPU的针脚数目
	 * @param pins CPU的针脚数目
	 */
	public IntelCPU(int pins) {
		this.pins = pins;
	}
	
	public void calculate() {
        System.out.println("now in Intel CPU, pins=" + pins);
	}
}
src\computer\AMDCPU.java
~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * AMD的CPU实现
 */
public class AMDCPU implements CPUApi {
    /**
     * CPU的针脚数目
     */
	private int pins = 0;
	
	/**
	 * 构造方法,传入CPU的针脚数目
	 * @param pins CPU的针脚数目
	 */
	public AMDCPU(int pins) {
		this.pins = pins;
	}
	
	public void calculate() {
        System.out.println("now in AMD CPU, pins=" + pins);
	}
}
src\computer\MainBoardApi.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 主板的接口
 */
public interface MainBoardApi {
    /**
     * 示意方法,主板具有安装CPU的功能
     */
	public void installCPU();
}
src\computer\GAMainBoard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 技嘉的主板实现
 */
public class GAMainBoard implements MainBoardApi {
    /**
     * CPU插槽的孔数
     */
	private int cpuHoles = 0;
	
	/**
	 * 构造方法, 传入CPU插糟的孔数
	 */
	public GAMainBoard(int cpuHoles) {
		this.cpuHoles = cpuHoles;
	}
	
	public void installCPU() {
		System.out.println("now in GAMainBoard, cpuHoles=" + cpuHoles);
	}
}
src\computer\MSIMainBoard.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 微星的主板实现
 */
public class MSIMainBoard implements MainBoardApi {
    /**
     * CPU插槽的孔数
     */
	private int cpuHoles = 0;
	
	/**
	 * 构造方法, 传入CPU插糟的孔数
	 */
	public MSIMainBoard(int cpuHoles) {
		this.cpuHoles = cpuHoles;
	}
	
	public void installCPU() {
		System.out.println("now in MSIMainBoard, cpuHoles=" + cpuHoles);
	}
}
src\computer\CPUFactory.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 创建CPU的简单工厂
 */
public class CPUFactory {
    /**
     * 创建CPU接口对象的方法
     * @param type 选择CPU类型的参数
     * @return CPU接口对象
     */
	public static CPUApi createCPUApi(int type) {
		CPUApi cpu = null;
		
		// 根据参数来选择并创建相应的CPU对象
		if (1 == type) {
			cpu = new IntelCPU(1156);
		} else if (2 == type) {
			cpu = new AMDCPU(939);
		}
		
		return cpu;
	}
}
src\computer\MainBoardFactory.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 创建主板的简单工厂
 */
public class MainBoardFactory {
    /**
     * 创建主板接口对象的方法
     * @param type 选择主板类型的参数
     * @return 主板接口对象
     */
	public static MainBoardApi createMainBoardApi(int type) {
		MainBoardApi mainBoard = null;
		
		// 根据参数来选择并创建相应的主板对象
		if (1 == type) {
			mainBoard = new GAMainBoard(1156);
		} else if (2 == type) {
			mainBoard = new MSIMainBoard(939);
		}
		
		return mainBoard;
	}
}
src\computer\ComputerEngineer.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 装机工程师类
 */
public class ComputerEngineer {
    /**
     * 组装机器需要的CPU
     */
	private CPUApi cpu = null;
	
	/**
	 * 组装机器需要的主板
	 */
	private MainBoardApi mainBoard= null;
	
	/**
	 * 装机过程
	 * @param cpuType 客户选择所需的CPU类型
	 * @param mainBoardType 客户选择所需的主板类型
	 */
	public void makeComputer(int cpuType, int mainBoardType) {
		// 1: 首先准备好装机所需要的配件
		prepareHardwares(cpuType, mainBoardType);
		// 2: 组装机器
		// 3: 测试机器
		// 4: 交付客户
	}
	
	/**
	 * 准备装机所需要的配件
	 * @param cpuType 客户选择所需的CPU类型
	 * @param mainBoardType 客户选择所需的主板类型
	 */
	public void prepareHardwares(int cpuType, int mainBoardType) {
	    // 这里要去准备CPU和主板的具体实现,简单起见,这里只准备这两个
		// 可是,装机工程师并不知道如何去创建,怎么办呢?
		
		// 直接找相应的工厂获取
		this.cpu = CPUFactory.createCPUApi(cpuType);
		this.mainBoard = MainBoardFactory.createMainBoardApi(mainBoardType);
		
		// 测试一下配件是否好用
		this.cpu.calculate();
		this.mainBoard.installCPU();
	}
}
src\user\Client.java
~~~~~~~~~~~~~~~~~~~~

package user;

import computer.ComputerEngineer;

public class Client {
	public static void main(String[] args) {
		// 创建装机工程师对象
		ComputerEngineer engineer = new ComputerEngineer();
		
        // 告诉装机工程师自己选择的配件,让装机工程师组装电脑
		engineer.makeComputer(1, 1);
	}
}


------------------------------------------------------------------------------------------------------------------

不使用模式时存在的问题 : 
CPU对象和主板对象是有关系的,是需要相互匹配的。

------------------------------------------------------------------------------------------------------------------


src\computer\AbstractFactory.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 抽象工厂的接口,声明创建抽象产品对象的操作
 */
public interface AbstractFactory {
    /**
     * 创建CPU的对象
     * @return CPU的对象
     */
	public CPUApi createCPUApi();
	
	/**
	 * 创建主板的对象
	 * @return 主板的对象
	 */
	public MainBoardApi createMainBoardApi();
}
src\computer\Schema1.java
~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 装机方案一:Intel的CPU + 技嘉的主板
 * 这里创建CPU和主板对象的时候,是对应的,能匹配上的
 */
public class Schema1 implements AbstractFactory {
	public CPUApi createCPUApi() {
		return new IntelCPU(1156);
	}

	public MainBoardApi createMainBoardApi() {
		return new GAMainBoard(1156);
	}
}
src\computer\Schema2.java
~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 装机方案二:AMD的CPU + 微星的主板
 * 这里创建CPU和主板对象的时候,是对应的,能匹配上的
 */
public class Schema2 implements AbstractFactory {
	public CPUApi createCPUApi() {
		return new AMDCPU(939);
	}

	public MainBoardApi createMainBoardApi() {
		return new MSIMainBoard(939);
	}
}
src\computer\ComputerEngineer.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package computer;

/**
 * 装机工程师类
 */
public class ComputerEngineer {
    /**
     * 组装机器需要的CPU
     */
	private CPUApi cpu = null;
	
	/**
	 * 组装机器需要的主板
	 */
	private MainBoardApi mainBoard= null;
	
	/**
	 * 装机过程
	 * @param schema 客户选择的装机方案
	 */
	public void makeComputer(AbstractFactory schema) {
		// 1: 首先准备好装机所需要的配件
		prepareHardwares(schema);
		// 2: 组装机器
		// 3: 测试机器
		// 4: 交付客户
	}
	
	/**
	 * 准备装机所需要的配件
	 * @param schema 客户选择的装机方案
	 */
	public void prepareHardwares(AbstractFactory schema) {
	    // 这里要去准备CPU和主板的具体实现,简单起见,这里只准备这两个
		// 可是,装机工程师并不知道如何去创建,怎么办呢?
		
		// 使用抽象工厂来获取相应的接口对象
		this.cpu       = schema.createCPUApi();
		this.mainBoard = schema.createMainBoardApi();
		
		// 测试一下配件是否好用
		this.cpu.calculate();
		this.mainBoard.installCPU();
	}
}
src\user\Client.java
~~~~~~~~~~~~~~~~~~~~

package user;

import computer.AbstractFactory;
import computer.ComputerEngineer;
import computer.Schema1;

public class Client {
	public static void main(String[] args) {
		// 创建装机工程师对象
		ComputerEngineer engineer = new ComputerEngineer();
		
		// 客户选择并创建需要使用的装机方案
		AbstractFactory schema = new Schema1();
		
        // 告诉装机工程师自己选择的装机方案,让装机工程师组装电脑
		engineer.makeComputer(schema);
	}
}

@@@抽象工厂模式的实现:
1. 实现成接口

@@@抽象工厂模式的优点:
1. 分离接口和实现
2. 使得切换产品簇变得容易

@@@抽象工厂模式的缺点:
1. 不太容易扩展新的产品
2. 容易造成类层次复杂

@@@抽象工厂模式的本质:
选择产品簇的实现

@@@抽象工厂模式体现的设计原则:
依赖倒置原则
最少知识原则

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值