<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

    建造者模式:導(dǎo)向器封裝生成產(chǎn)品的具體步驟

    《設(shè)計(jì)模式》中定義:
    Builder模式的緣起:
        假設(shè)創(chuàng)建游戲中的一個(gè)房屋House設(shè)施,該房屋的構(gòu)建由幾部分組成,且各個(gè)部分富于變化。如果使用最直觀的設(shè)計(jì)方法,每一個(gè)房屋部分的變化,都將導(dǎo)致房屋構(gòu)建的重新修正.....
    動(dòng)機(jī)(Motivation):
        在軟件系統(tǒng)中,有時(shí)候面臨一個(gè)"復(fù)雜對象"的創(chuàng)建工作,其通常由各個(gè)部分的子對象用一定算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合到一起的算法卻相對穩(wěn)定。
        如何應(yīng)對種變化呢?如何提供一種"封裝機(jī)制"來隔離出"復(fù)雜對象的各個(gè)部分"的變化,從而保持系統(tǒng)中的"穩(wěn)定構(gòu)建算法"不隨需求的改變而改變?
    意圖(Intent):
        將一個(gè)復(fù)雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
    UML 表示如下:
    uml2
    Builder模式

    這里的Builder是一個(gè)抽象類,不是接口,為了共用一些屬性和代碼,把稍微變化的部分讓子類來實(shí)現(xiàn)(顯然Builder 和 ConcreteOneProduct、ConcreteTwoProduct組成了個(gè)模板模式)。

    先看建造者,一個(gè)抽象類,提供一些公用實(shí)現(xiàn)(Builder.java):
    /**
     * 一個(gè)抽象來來替代接口
     
     @author yongboy@gmail.com
     * @date 2010-10-26
     @version 1.0
     */
    public abstract class Builder {
      protected Product product = null;

      public Builder() {
        product = new Product();
      }

      /**
       * 產(chǎn)生描述內(nèi)容
       */
      public abstract void genDesc(String desc);

      /**
       * 繪制三角形
       */
      public abstract void genTriangle(int len);

      /**
       * 輸出最終產(chǎn)生的產(chǎn)品
       
       @return
       */
      public Product getProduct() {
        return product;
      }
    }

    一個(gè)實(shí)現(xiàn),主要是繪制三角形:
    public class ConcreteOneBuilder extends Builder {

      @Override
      public void genDesc(String desc) {
        product.setDesc(desc);
      }

      @Override
      public void genTriangle(int len) {
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < len; i++) {
          for (int j = 0; j < i; j++) {
            sb.append(" *");
          }
          sb.append("\n");
        }

        product.setContent(sb.toString());
      }
    }

    第二個(gè)實(shí)現(xiàn):
    public class ConcreteTwoBuilder extends Builder {

      @Override
      public void genDesc(String desc) {
        product.setDesc(desc);
      }

      @Override
      public void genTriangle(int len) {
        StringBuilder sb = new StringBuilder();

        for (int i = len; i > 0; i--) {
          int spaceNum = len - i;

          for (int j = 0; j < spaceNum; j++) {
            sb.append("  ");
          }
          for (int j = 0; j < i; j++) {
            sb.append(" *");
          }

          sb.append("\n");
        }

        product.setContent(sb.toString());
      }
    }

    產(chǎn)品定義:
    /**
     * 一個(gè)有關(guān)三角的產(chǎn)品
     
     @author yongboy@gmail.com
     * @date 2010-10-26
     @version 1.0
     */
    public class Product implements Serializable {
      private final static long serialVersionUID = 23536326475869L;

      /**
       * 當(dāng)前產(chǎn)品的描述
       */
      private String desc;

      /**
       * 當(dāng)前產(chǎn)品的詳細(xì)內(nèi)容
       */
      private String content;

      public Product() {
      }

      public String getDesc() {
        return desc;
      }

      public void setDesc(String desc) {
        this.desc = desc;
      }

      public String getContent() {
        return content;
      }

      public void setContent(String content) {
        this.content = content;
      }

      public String toString() {
        return desc + "\n" + content;
      }
    }

    導(dǎo)向器,封裝著產(chǎn)品生成的具體過程:
    /**
     * 導(dǎo)向器,封裝產(chǎn)品生生成過程
     
     @author yongboy@gmail.com
     * @date 2010-10-26
     @version 1.0
     */
    public class Director {
      private Builder builder;
      private int MAX = 25;
      private int MIN = 10;

      public Director(Builder builder) {
        this.builder = builder;
      }

      public void construct() {
        int len = getNext();
        builder.genDesc("產(chǎn)品型號(hào)(" + getFormatNum(len"):");
        builder.genTriangle(len);
      }

      private int getNext() {
        return getRandomNum(MIN, MAX);
      }

      private static String getFormatNum(int num) {
        return String.format("0.%d", num);
      }
      
      /**
       * 產(chǎn)生兩個(gè)數(shù)之間的隨機(jī)數(shù)
       
       @param min
       @param max
       @return
       */
      private int getRandomNum(double min, double max) {
        return (intmin + (int) (Math.random() (max - min));
      }
    }

    客戶端代碼調(diào)用方式:
    public class Client {
      public static void main(String[] args) {
        Builder builder = new ConcreteOneBuilder();

        Director director = new Director(builder);

        director.construct();

        Product product = builder.getProduct();

        System.out.println(product);

        System.out.println();
        System.out.println("現(xiàn)在輸出第二個(gè)產(chǎn)品:\n");
        System.out.println();

        builder = new ConcreteTwoBuilder();

        director = new Director(builder);

        director.construct();

        product = builder.getProduct();

        System.out.println(product);
      }
    }

    輸入如下:

    產(chǎn)品型號(hào)(0.23):
    *
    * *
    * * *
    * * * *
    * * * * *
    * * * * * *
    * * * * * * *
    * * * * * * * *
    * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * * *
    * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * * *


    現(xiàn)在輸出第二個(gè)產(chǎn)品:


    產(chǎn)品型號(hào)(0.17):
    * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * *
    * * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * *
    * * * * * * * *
    * * * * * * *
    * * * * * *
    * * * * *
    * * * *
    * * *
    * *
    *

    每一次運(yùn)行可能生成變形長度都會(huì)變好,這個(gè)變好有導(dǎo)向器進(jìn)行控制著。

    源文件下載

    posted on 2010-10-26 17:36 nieyong 閱讀(352) 評(píng)論(0)  編輯  收藏 所屬分類: Java

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2010年10月>
    262728293012
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個(gè)人收藏

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品成人片在线播放| 亚洲AV日韩精品久久久久久久 | 亚洲黄页网在线观看| 无码av免费一区二区三区| 亚洲日韩精品无码专区网站| 精品一区二区三区无码免费直播| 全免费一级毛片在线播放| 亚洲人成色777777老人头| 免费看AV毛片一区二区三区| 国产精品免费观看视频| 亚洲精品色午夜无码专区日韩| 久草免费在线观看视频| 中文无码亚洲精品字幕| 丝袜熟女国偷自产中文字幕亚洲| 久久精品免费大片国产大片| 亚洲国产综合无码一区| 女人18毛片a级毛片免费视频| 人妻丰满熟妇无码区免费| 老司机精品视频免费| 亚洲国产成人久久综合区| 黄页网站在线免费观看| 久久亚洲免费视频| 免费无码黄动漫在线观看| 久久免费美女视频| 亚洲欧洲日韩国产| 嫩草视频在线免费观看| 你懂的免费在线观看| 蜜芽亚洲av无码精品色午夜| 1000部夫妻午夜免费| 亚洲中文无码永久免费| 国产无遮挡裸体免费视频| 亚洲国产成人手机在线观看| 九月婷婷亚洲综合在线| 日韩a级无码免费视频| 亚洲国产精品网站久久| 亚洲一区二区三区影院| 很黄很黄的网站免费的| a毛片全部播放免费视频完整18| 国产91成人精品亚洲精品| 亚洲成色www久久网站夜月| 99热在线精品免费全部my|