zoukankan      html  css  js  c++  java
  • 装机主板抽象工厂模式(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
    装机和主板
    ---------------------------------

  • 相关阅读:
    【题解】B进制星球
    高斯消元
    7.16
    题解 P1572 【计算分数】
    7.30
    7.31
    项目中使用 MyBatis(一)
    从整体上了解Spring MVC
    Spring注解
    Spring IOC 和 DI
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3112947.html
Copyright © 2011-2022 走看看