(原文转自: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); } }