• 《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/

  • 相关阅读:
    Unicode详解
    VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏
    关于MFC下检查和消除内存泄露的技巧
    ASCII 、GB2312、GBK、GB18030、unicode、UTF8字符集编码详解
    A note from UrlEscape Function
    Unicode和UTF8之间的转换详解
    Base64编码
    全面解读WM_NOTIFY
    关于URL编码
    URL的#号
  • 原文地址:https://www.cnblogs.com/draem0507/p/3796286.html
Copyright © 2020-2023  润新知