装机主板抽象工厂模式(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. 轻易造成类层次复杂
@@@抽象工厂模式的本质:
选择产品簇的实现
@@@抽象工厂模式表现的设计原则:
依赖颠倒原则
起码知识原则
文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!
---------------------------------
原创文章 By
装机和主板
---------------------------------