抽象工厂模式

(原文转自:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
说明:
    简单工厂尚有个问题没有解决:当客户给出的cpu、mainboard类型分别是1,2的话,实际上是不兼容的。而简单工厂并没有维护对象之间的关系
   每一个模式都是针对一定问题的解决方案。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
 

源代码

  前面示例实现的CPU接口和CPU实现对象,主板接口和主板实现对象,都不需要变化。

  前面示例中创建CPU的简单工厂和创建主板的简单工厂,都不再需要。

  新加入的抽象工厂类和实现类:

/**
 * Project Name:DesignPatterns
 * File Name:IntelFactory.java
 * Package Name:com.louis.abstractfactory
 * Date:2017年9月25日下午10:50:51
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.abstractfactory;
/**
 * ClassName:IntelFactory 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月25日 下午10:50:51 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public interface AbstractFactory {
    //创建cpu对象
    public Cpu createCpu();
    
    //创建主板对象
    public Mainboard createMainboard();
}
/**
 * Project Name:DesignPatterns
 * File Name:IntelFactory.java
 * Package Name:com.louis.abstractfactory
 * Date:2017年9月25日下午10:55:15
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.abstractfactory;
/**
 * ClassName:IntelFactory 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月25日 下午10:55:15 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class IntelFactory implements AbstractFactory {

    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.abstractfactory.AbstractFactory#createCpu()
     */
    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new CpuIntel(755);
    }

    /**
     * TODO 简单描述该方法的实现功能(可选).
     * @see com.louis.abstractfactory.AbstractFactory#createMainboard()
     */
    @Override
    public Mainboard createMainboard() {
        // TODO Auto-generated method stub
        return new MainboardIntel(755);
    }

}
/**
 * Project Name:DesignPatterns
 * File Name:AmdFactory.java
 * Package Name:com.louis.abstractfactory
 * Date:2017年9月25日下午10:56:35
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.abstractfactory;
/**
 * ClassName:AmdFactory 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月25日 下午10:56:35 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class AmdFactory implements AbstractFactory {

    @Override
    public Cpu createCpu() {
        // TODO Auto-generated method stub
        return new CpuIntel(938);
    }

    @Override
    public Mainboard createMainboard() {
        // TODO Auto-generated method stub
        return new MainboardIntel(938);
    }

}
/**
 * Project Name:DesignPatterns
 * File Name:ComputerEngineer.java
 * Package Name:com.louis.simplefactory
 * Date:2017年9月25日下午9:33:31
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.abstractfactory;
/**
 * ClassName:ComputerEngineer 
 * Function: 组装电脑
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月25日 下午9:33:31 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ComputerEngineer {
    //定义cpu
    private Cpu cpu;
    //定义主板
    private Mainboard mainboard;
    /*
     * 组装电脑
     * */
    public void makeComputer(AbstractFactory af){
        //1准备好装机所需要的配置
        this.prepareHardwares(af);
        //2组装机器
        
        //3测试机器
        
        //4支付客户
    }
    
    public void prepareHardwares(AbstractFactory af){
        //cpu和主板的具体实现
        //装机师傅直接找相应的工程获取
        this.cpu = af.createCpu();
        this.mainboard = af.createMainboard();
        
        //测试配件是否好用
        this.cpu.calculate();
        this.mainboard.installCPU();
    }
    
}
/**
 * Project Name:DesignPatterns
 * File Name:Client.java
 * Package Name:com.louis.simplefactory
 * Date:2017年9月25日下午9:44:08
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.abstractfactory;
/**
 * ClassName:Client 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年9月25日 下午9:44:08 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class Client {
    public static void main(String[] args) {
        //用户指定用哪个cpu或者mainboard
        ComputerEngineer computerEngineer = new ComputerEngineer();
        AbstractFactory aFactory = new IntelFactory();
        computerEngineer.makeComputer(aFactory);
    
    }
}

原文地址:https://www.cnblogs.com/Michael2397/p/7580675.html