zoukankan      html  css  js  c++  java
  • 《JAVA与模式》之抽象工厂模式

      Abstract Factory定义 
       为一系列相关对象或相互依赖的对象创建一个接口,而无需指定它们的具体类。抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,来让客户端使用 

    上面的uml图,我们会发现,ConcreteFactory1只会生成A1+B1,是有严格约束的,如果没有这个约束条件,则可用工厂方法代替


    举个例子,有个抽象汽车工厂负责生产汽车,我们假设生产汽车的过程包括汽车门和汽车轮子,目前有奥迪和奔驰两个工厂,分别生产各自的汽车

     1 // 抽象工厂
     2 interface AbstractCarFactory {
     3     /** 生产汽车门 */
     4     public Door createDoor();
     5 
     6     /** 生产汽车轮子 */
     7     public Wheel createWheel();
     8 
     9 }
    10 
    11 class BenzFactory implements AbstractCarFactory {
    12 
    13     public Door createDoor() {
    14         // TODO Auto-generated method stub
    15         return new BenzDoor();
    16     }
    17 
    18     public Wheel createWheel() {
    19         // TODO Auto-generated method stub
    20         return new BenzWheel();
    21     }
    22 }
    23 
    24 class AudiFactory implements AbstractCarFactory {
    25 
    26     public Door createDoor() {
    27         // TODO Auto-generated method stub
    28         return new AudiDoor();
    29     }
    30 
    31     public Wheel createWheel() {
    32         // TODO Auto-generated method stub
    33         return new AudiWheel();
    34     }
    35 }
    36 
    37 interface Door {
    38     // public void createDoor();
    39 }
    40 
    41 interface Wheel {
    42 
    43     // public void createWheel();
    44 }
    45 
    46 class BenzDoor implements Door {
    47 
    48     public BenzDoor() {
    49         System.out.println("生产奔驰汽车门");
    50     }
    51 }
    52 
    53 class AudiDoor implements Door {
    54 
    55     public AudiDoor() {
    56         System.out.println("生产奥迪汽车门");
    57     }
    58 }
    59 
    60 class BenzWheel implements Wheel {
    61 
    62     public BenzWheel() {
    63         System.out.println("生产奔驰轮子");
    64     }
    65 }
    66 
    67 class AudiWheel implements Wheel {
    68 
    69     public AudiWheel() {
    70 
    71         System.out.println("生产奥迪轮子");
    72     }
    73 
    74 }

    测试代码

    // 抽象工厂 在工厂方法基础上 复杂了产品线 即产品组 多个产品配件组成一个工厂产品并且产品是一个系列的,随意组合就不能构成最终的产品
    
            AbstractCarFactory beazFactory = new BenzFactory();
            AbstractCarFactory audiFactory = new AudiFactory();
            beazFactory.createDoor();
            audiFactory.createWheel();

    ps:本例子中缺少一个角色,负责组装产品,这个角色中定义了抽象工厂,最后通过具体工厂对象来组装产品,这里就省略了

    我们整理下代码

    发现抽象工厂模式由几个角色组成

    1.抽象工厂角色

    2.具体工厂角色

    3.抽象产品角色

    4.具体产品角色

    具体工厂负责组装不同的产品角色,最后形成产品

    简单工厂、工厂方法、抽象工厂区别

    总结:用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。

    参考:

    http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

    http://men4661273.iteye.com/blog/1637880

    http://blog.csdn.net/yuan22003/article/details/6709630   

     http://tianli.blog.51cto.com/190322/32545/

  • 相关阅读:
    我的第一个Node.js项目
    map.keySet()获取map全部的key值
    sql语句的优化
    操作数据库的快捷键
    学习方法(准则)
    input输入框的readonly属性-----http://www.w3school.com.cn/tags/tag_input.asp
    Java反射机制(Reflect)解析-----https://www.cnblogs.com/fzz9/p/7738381.html
    java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
    jQuery入门--- 非常好
    JQuery_九大选择器
  • 原文地址:https://www.cnblogs.com/draem0507/p/3796286.html
Copyright © 2011-2022 走看看