每日一贴,今天的内容关键字为装机主板
@@@模式定义:
提供一个创立一系列相干或互相依赖对象的接口,而无需指定它们具体的类。
@@@训练示例:
选择组装电脑的配件。
@@@示例代码:
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. 轻易造成类层次复杂
@@@抽象工厂模式的本质:
选择产品簇的实现
@@@抽象工厂模式表现的设计原则:
依赖颠倒原则
起码知识原则