设为首页收藏本站
查看: 202|回复: 0

抽象工厂模式 Abstract Factory

[复制链接]

75

主题

75

帖子

442

积分

网站编辑

Rank: 8Rank: 8

积分
442
发表于 2017-1-16 11:10:07 | 显示全部楼层 |阅读模式
1.定义提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

2.思路
两个问题点:一个是只知道所需要的一系列对象的接口,而不知道具体实现,或者不知道具体使用哪一个类实现,另外一个是这一系列对象是相关或者相互依赖的,也就是说既要创建接口的对象,还要越苏他们之间的关系。
这里要解决的问题和工厂方法模式或简单工厂解决的问题是有很大不同的,工厂方法模式或简单工厂关注的是单个产品对象的创建,比如创建CPU 的工厂方法,它就只关心如何创建CPU对象。
这里要解决的问题是:要创建一系列的产品对象,而且这一系列对象是构建新的对象所需要的组成部分,也就是这一系列被创建的对象相互之间是有约束的。
解决这个问题的一个解决方案就是抽象工厂模式,在这个模式里面,会定义一个抽象工厂(一般定义成接口),在里面虚拟地穿件客户需要的这一系列对象,所谓虚拟的就是定义创建这些对象的抽象方法,并不真正的实现,然后由具体的抽象工厂的子类来提供这一系列对象的创建。这样一来可以为同一个抽象工厂提供很多不同的实现,那么创建的这一系列对象也就不一样了,也就是说,抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,来让客户来使用。



3.功能
为一系列相关对象或是相互依赖的对象创建一个接口。

4.实例
  1. /*
  2. * CPU的接口
  3. */
  4. public interface CPUApi {
  5.     //示意方法,CPU具有计算能力
  6.     public void calculate();
  7.    
  8. }

  9. /*
  10. * Intel 的CPU实现
  11. */
  12. public class IntelCPU implements CPUApi{
  13.     // CPU的针脚数
  14.     private int pins = 0;
  15.     public IntelCPU(int pins){
  16.         this.pins = pins;
  17.     }
  18.     @Override
  19.     public void calculate() {
  20.         // TODO Auto-generated method stub
  21.         System.out.println("张梦琴  使用 Intel CPU , pins = "+pins);
  22.     }
  23. }

  24. /*
  25. * AMD 的CPU实现
  26. */
  27. public class AMDCPU implements CPUApi{
  28.    
  29.     // CPU的针脚数
  30.     private int pins = 0;
  31.    
  32.     public AMDCPU(int pins){
  33.         this.pins = pins;
  34.     }
  35.     @Override
  36.     public void calculate() {
  37.         // TODO Auto-generated method stub
  38.         System.out.println("张梦琴 使用 AMD CPU , pins = "+pins);
  39.     }
  40. }

  41. /*
  42. * 主板的接口
  43. */
  44. public interface MainboardApi {
  45.     //示意方法,主板具有安装CPU的功能
  46.     public void installCPU();
  47.    
  48. }

  49. /*
  50. * 技嘉的主板
  51. */
  52. public class GAMainboard implements MainboardApi{
  53.    
  54.     private int cpuHoles = 0;
  55.    
  56.     public GAMainboard(int cpuHoles){
  57.         this.cpuHoles = cpuHoles;
  58.     }
  59.     @Override
  60.     public void installCPU() {
  61.         // TODO Auto-generated method stub
  62.         System.out.println(" 张梦琴 使用 GAMainboard , cpuHoles = "+cpuHoles);
  63.     }
  64. }

  65. /*
  66. * 微型的主板
  67. */
  68. public class MSIMainboard implements MainboardApi{
  69.     private int cpuHoles = 0;
  70.    
  71.     public MSIMainboard(int cpuHoles){
  72.         this.cpuHoles = cpuHoles;
  73.     }
  74.     @Override
  75.     public void installCPU() {
  76.         // TODO Auto-generated method stub
  77.         System.out.println(" 张梦琴 使用 MSIMainboard , cpuHoles = "+cpuHoles);
  78.     }
  79. }

  80. /*
  81. * 抽象工厂的接口,声明创建抽象产品对象的操作
  82. */
  83. public interface AbstractFactory {
  84.     //创建CPU对象
  85.     public CPUApi createCPUApi();
  86.    
  87.     //创建主板对象
  88.     public MainboardApi createMainboardApi();
  89. }

  90. /*
  91. * 装机方案一:Intel的CPU + 技嘉的主板
  92. * 这里创建CPU和主板对象的时候,是对应的,能匹配上的
  93. */
  94. public class Schema1 implements AbstractFactory{
  95.     @Override
  96.     public CPUApi createCPUApi() {
  97.         // TODO Auto-generated method stub
  98.         return new IntelCPU(1156);
  99.     }
  100.     @Override
  101.     public MainboardApi createMainboardApi() {
  102.         // TODO Auto-generated method stub
  103.         return new GAMainboard(1156);
  104.     }
  105. }

  106. /*
  107. * 装机方案二:AMD的CPU + 微星的主板
  108. * 这里创建CPU和主板对象的时候,是对应的,能匹配上的
  109. */
  110. public class Schema2 implements AbstractFactory{
  111.     @Override
  112.     public CPUApi createCPUApi() {
  113.         // TODO Auto-generated method stub
  114.         return new AMDCPU(939);
  115.     }
  116.     @Override
  117.     public MainboardApi createMainboardApi() {
  118.         // TODO Auto-generated method stub
  119.         return new MSIMainboard(939);
  120.     }
  121. }

  122. /*
  123. * 装机工程师的类
  124. */
  125. public class ComputerEngineer2 {
  126.     // 定义组装机器需要的CPU
  127.     private CPUApi cpu = null;
  128.     // 定义组装机器需要的主板
  129.     private MainboardApi mainboard = null;
  130.     // 装机过程
  131.     public void makeComputer(AbstractFactory schema) {
  132.         // 1.首先准本好装机需要的配件
  133.         prepareHardWares(schema);
  134.         // 2.组装机器
  135.         // 3.测试机器
  136.         // 4.交付客户
  137.     }
  138.     private void prepareHardWares(AbstractFactory schema) {
  139.         // 抽象工厂
  140.         this.cpu = schema.createCPUApi();
  141.         this.mainboard = schema.createMainboardApi();
  142.         this.cpu.calculate();
  143.         this.mainboard.installCPU();
  144.     }
  145. }

  146. public class Client {
  147.     /**
  148.      * @param args
  149.      */
  150.     public static void main(String[] args) {
  151.         // TODO Auto-generated method stub
  152. //        ComputerEngineer engineer = new ComputerEngineer();
  153. //        engineer.makeComputer(1, 1);
  154.         
  155.         ComputerEngineer2 engineer = new ComputerEngineer2();
  156.         engineer.makeComputer(new Schema2());
  157.     }
  158. }

复制代码

回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

推荐阅读 More>
广告位

Powered by Discuz X3.2

© 2001-2016   

合作伙伴

返回顶部 返回列表