zoukankan      html  css  js  c++  java
  • 23种设计模式之建造者模式

     1 /**
     2  * 作用:
     3  * 将复杂物体的构建与表现相分离。
     4  * 組成角色:
     5  * 1)建造者(Builder):負責定義用來生成實例的接口(API)
     6  * 2)具体的建造者(ConcreateBuilder):负责实现Builder角色定义的接口实现类。
     7  *   针对不同的业务逻辑,具体化复杂对象的各部分的创建。在建造完成之后提供产品的实例。
     8  * 3)监工(Director):Director角色负责使用Builder角色的接口API来生成实例。内部不涉及具体产品信息,只负责
     9  *   保证对象各部分完整创建或按照某种顺序进行创建。即Director是负责指挥如何build的,只负责调度,具体实施交给具体的建造者。
    10  * 4)产品(Product):即要创建的复杂对象。
    11  * 5)使用者(Client):实际使用Builder模式的角色,即下面的测试类。
    12  * 
    13  * 优缺点:
    14  *   封装性:客户端不必知道产品内部组合细节,只需关心我们要生成的某个对象,具体对象产生细节不必知晓。
    15  *   建造者独立,易于扩展:案例只列举了ConcreateBuilder建造者类,如果需要其它建造者新建类即可。建造者之间彼此独立,系统扩展性好,符合开闭原则。
    16  *   便于控制细节风险:由于具体建造者是独立的,因此可以对具体建造过程中逐步细化,不会对其他模块产生影响。
    17  * 
    18  * 应用场景
    19  *   产品类非常复杂,不同的调度产生不同的结果时,使用建造者模式比较适合;
    20  *   相同的组件或配件都可以装配到一个对象,但是产生的结果又不相同,可以使用建造者模式。
    21  *   
    22  *建造者模式VS工厂模式
    23  *  建造者模式关注零件类型和装配顺序,同为创建型模式,注重点不同。
    24  *  工厂模式只有一个建造方法,而建造者有多个建造零件并且强调建造顺序,而工厂模式没有顺序的概念。
    25  *
    26  * @author mcebgadmin
    27  *
    28  */

     1 //产品类,要建造的对象
     2 public class Product {
     3     private String ground;
     4     private String cement;
     5     private String roof;
     6     
     7     public Product() {
     8         
     9     }
    10     public String getGround() {
    11         return ground;
    12     }
    13     public void setGround(String ground) {
    14         this.ground = ground;
    15     }
    16     public String getCement() {
    17         return cement;
    18     }
    19     public void setCement(String cement) {
    20         this.cement = cement;
    21     }
    22     public String getRoof() {
    23         return roof;
    24     }
    25     public void setRoof(String roof) {
    26         this.roof = roof;
    27     }
    28 
    29 }
    30 /**
    31  * 建造者角色
    32  *
    33  */
    34 public interface Builder {
    35     //一般來說,有多少零配件,就有多少建造方法
    36     void buildGround();
    37     void buildCement();
    38     void buildRoof();
    39     
    40     //返回產品類
    41     Product builProduct();
    42 
    43 }
    44 /**
    45  * 建造者的實現類
    46  *
    47  */
    48 public class ConcreteBuilder implements Builder {
    49     private final Product product=new Product();
    50 
    51     @Override
    52     public void buildGround() {
    53         System.out.println("build地基");
    54         product.setGround("build地基");
    55     }
    56 
    57     @Override
    58     public void buildCement() {
    59         System.out.println("build水泥");
    60         product.setCement("build水泥");
    61     }
    62 
    63     @Override
    64     public void buildRoof() {
    65         System.out.println("build樓頂");
    66         product.setRoof("build樓頂");
    67     }
    68 
    69     @Override
    70     public Product builProduct() {
    71         System.out.println("建造完畢!");
    72         return product;
    73     }
    74 
    75 }
    76 /**
    77  * 監工,負責指揮builder如何建造即如何調度
    78  */
    79 public class Director {
    80     public Builder builder;
    81     public Director(Builder builder) {
    82         this.builder=builder;
    83     }
    84     
    85     public Product construct() {
    86         //構建順序:建造水泥->地基->樓頂
    87         builder.buildCement();
    88         builder.buildGround();
    89         builder.buildRoof();
    90         
    91         return builder.builProduct();
    92     }
    93 
    94 }
    
    
    
     
  • 相关阅读:
    01.mp4v2应用—mp4转h264
    00.mp4v2工具的用法
    交叉编译x264和ffmpeg
    pcm2aac
    保存一下东西
    05.移植内核3.4.2
    04.移植u-boot
    03.应用程序调试
    关于 jxl 下载 excel (java)
    JXL 对excle 操作(单元格合并,列宽,格式等)
  • 原文地址:https://www.cnblogs.com/HYV587/p/13131041.html
Copyright © 2011-2022 走看看