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

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

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

    聶永的博客

    記錄工作/學習的點點滴滴。

    建造者模式:導向器封裝生成產品的具體步驟

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

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

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

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

      /**
       * 產生描述內容
       */
      public abstract void genDesc(String desc);

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

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

    一個實現,主要是繪制三角形:
    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());
      }
    }

    第二個實現:
    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());
      }
    }

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

      /**
       * 當前產品的描述
       */
      private String desc;

      /**
       * 當前產品的詳細內容
       */
      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;
      }
    }

    導向器,封裝著產品生成的具體過程:
    /**
     * 導向器,封裝產品生生成過程
     
     @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("產品型號(" + getFormatNum(len"):");
        builder.genTriangle(len);
      }

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

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

    客戶端代碼調用方式:
    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("現在輸出第二個產品:\n");
        System.out.println();

        builder = new ConcreteTwoBuilder();

        director = new Director(builder);

        director.construct();

        product = builder.getProduct();

        System.out.println(product);
      }
    }

    輸入如下:

    產品型號(0.23):
    *
    * *
    * * *
    * * * *
    * * * * *
    * * * * * *
    * * * * * * *
    * * * * * * * *
    * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * * * *
    * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * * *


    現在輸出第二個產品:


    產品型號(0.17):
    * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * *
    * * * * * * * * * * * * *
    * * * * * * * * * * * *
    * * * * * * * * * * *
    * * * * * * * * * *
    * * * * * * * * *
    * * * * * * * *
    * * * * * * *
    * * * * * *
    * * * * *
    * * * *
    * * *
    * *
    *

    每一次運行可能生成變形長度都會變好,這個變好有導向器進行控制著。

    源文件下載

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

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

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

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人毛片免费观看| 无码日韩人妻av一区免费| 人人狠狠综合久久亚洲高清| 亚洲日韩精品无码专区加勒比☆| 免费A级毛片无码无遮挡内射| 亚洲熟妇色自偷自拍另类| h片在线免费观看| 亚洲日韩乱码中文无码蜜桃| h视频在线免费看| 亚洲精品成a人在线观看☆ | 亚洲午夜免费视频| 亚洲av无码一区二区三区不卡| 大地资源网高清在线观看免费 | 国产精品亚洲综合久久 | 在线观看免费无码视频| 亚洲AV无码一区东京热| 免费A级毛片无码视频| 亚洲一区二区三区在线| 午夜高清免费在线观看| 污污免费在线观看| 亚洲三区在线观看无套内射| 三年片在线观看免费观看大全动漫| 亚洲人成电影在线天堂| 免费a级毛片高清视频不卡| 精品亚洲福利一区二区| 亚洲最大AV网站在线观看| 无码精品一区二区三区免费视频| 亚洲国产人成在线观看| 国产人成免费视频| 久久aⅴ免费观看| 亚洲精品无码中文久久字幕| 国产亚洲美女精品久久久| 中文字幕免费观看| 综合偷自拍亚洲乱中文字幕| 亚洲乱码国产一区三区| 日韩欧美一区二区三区免费观看| 一级毛片a免费播放王色电影 | 亚洲AV永久无码区成人网站| 无码人妻一区二区三区免费| 一级A毛片免费观看久久精品 | 国产国产人免费人成免费视频|