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 }
    
    
    
     
  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/HYV587/p/13131041.html
Copyright © 2011-2022 走看看