亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入淺出基于Java的建造設計模式

2019-11-18 12:15:31
字體:
來源:轉載
供稿:網友

  一、引子
  前幾天陪朋友去裝機店攢了一臺電腦,看著裝機工在那里熟練的裝配著機器,不禁想起來了培訓時講到的建造模式。作為裝機工,他們不用管你用的CPU是Intel還是AMD,也不管你的顯卡是2000千大元還是白送的,都能三下五除二的裝配在一起——一臺PC就誕生了!當然對于客戶來說,你也不知道太多關于PC組裝的細節。這和建造模式是多么的相像?。?br />  
  今天就來探討一下建造模式
  
  二、定義與結構
  GOF給建造模式的定義為:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示??梢詫⒔ㄔ炷J降木韪爬椋簩嬙鞆碗s對象的過程和對象的部件解耦。這是對降低耦合、提高可復用性精神的一種貫徹。其實這種精神貫徹在GOF幾乎所有的設計模式中。
  
  是不是和上面提到的裝機流程相像?
  
  這個很多人認為同抽象工廠模式相似的建造模式用在什么樣的設計環境下呢(對于兩者的比較稍候討論)?我認為可以總結為以下環境:當要生成的產品有復雜的內部結構,其中的內部結構由多個對象組成;系統將來可能要改變產品對象的內部結構的構成或者實現方式,比如說產品的一些屬性現在是從數據庫中得到的,而將來可能從xml中解析得到;而且不能將產品的內部構造完全暴露給客戶程序,一是為了可用性,二是為了安全等因素。滿足上面的設計環境就可以考慮使用建造模式來搭建框架了。 來看看建造模式的組成吧。
  
  抽象建造者角色:這個角色用來規范產品對象的各個組成成分的建造。一般而言,此角色獨立于應用程序的商業邏輯。
  
  具體建造者角色:擔任這個角色的是于應用程序緊密相關的類,它們在指導者的調用下創建產品實例。這個角色在實現抽象建造者角色提供的方法的前提下,達到完成產品組裝,提供成品的功能。
  
  指導者角色:調用具體建造者角色以創建產品對象。指導者并沒有產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。 產品角色:建造中的復雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的接口。
  
  來看下這些角色組成的類圖:
  深入淺出基于Java的建造設計模式
  首先客戶程序創建一個指導者對象,一個建造者角色,并將建造者角色傳入指導者對象進行配置。然后,指導者按照步驟調用建造者的方法創建產品。最后客戶程序從建造者或者指導者那里得到產品。
  
  從建造模式的工作流程來看,建造模式將產品的組裝“外部化”到了建造者角色中來。這是和任何正規的工廠模式不一樣的——產品的創建是在產品類中完成的。
  
  三、實現
  實在找不到太好的例子,我認為《java與模式》中發郵件的例子還算可以。這里我將《Think in Patterns with Java》中的例子放到這里權且充個門面。媒體可以存在不同的表達形式,比如書籍、雜志和網絡。這個例子表示不同形式的媒體構造的步驟是相似的,所以可以被提取到指導者角色中去。
  
  import java.util.*;
  import junit.framework.*;
  
  //不同的媒體形式:
  
  class Media extends ArrayList {}
  class Book extends Media {}
  class Magazine extends Media {}
  class WebSite extends Media {}
  
  // 進而不含不同的媒體組成元素:
  
  class MediaItem {
  PRivate String s;
  public MediaItem(String s) { this.s = s; }
  public String toString() { return s; }
  }
  
  class Chapter extends MediaItem {
  public Chapter(String s) { super(s); }
  }
  
  class Article extends MediaItem {
  public Article(String s) { super(s); }
  }
  
  class WebItem extends MediaItem {
  public WebItem(String s) { super(s); }
  }
  
  // 抽象建造者角色,它規范了所有媒體建造的步驟:
  
  class MediaBuilder {
  public void buildBase() {}
  public void addMediaItem(MediaItem item) {}
  public Media getFinishedMedia() { return null; }
  }
  
  //具體建造者角色
  
  class BookBuilder extends MediaBuilder {
  private Book b;
  public void buildBase() {
  System.out.println("Building book framework");
  b = new Book();
  }
  
  public void addMediaItem(MediaItem chapter) {
  System.out.println("Adding chapter " + chapter);
  b.add(chapter);
  }
  public Media getFinishedMedia() { return b; }
  }
  
  class MagazineBuilder extends MediaBuilder {
  private Magazine m;
  public void buildBase() {
  System.out.println("Building magazine framework");
  m = new Magazine();
  }
  
  public void addMediaItem(MediaItem article) {
  System.out.println("Adding article " + article);
  m.add(article);
  }
  public Media getFinishedMedia() { return m; }
  }
  
  class WebSiteBuilder extends MediaBuilder {
  private WebSite w;
  public void buildBase() {
  System.out.println("Building web site framework");
  w = new WebSite();
  }
  
  public void addMediaItem(MediaItem webItem) {
  System.out.println("Adding web item " + webItem);
  w.add(webItem);
  }
  
  public Media getFinishedMedia() { return w; }
  }
  
  //指導者角色,也叫上下文
  class MediaDirector {
  private MediaBuilder mb;
  public MediaDirector(MediaBuilder mb) {
  this.mb = mb; //具有策略模式相似特征的
  }
  
  public Media prodUCeMedia(List input) {
  mb.buildBase();
  for(Iterator it = input.iterator(); it.hasNext();)
  mb.addMediaItem((MediaItem)it.next());
  return mb.getFinishedMedia();
  }
  };
  
  //測試程序——客戶程序角色
  
  public class BuildMedia extends TestCase {
  private List input = Arrays.asList(new MediaItem[] {
  new MediaItem("item1"), new MediaItem("item2"),
  new MediaItem("item3"), new MediaItem("item4"),
  });
  
  public void testBook() {
  MediaDirector buildBook = new MediaDirector(new BookBuilder());
  Media book = buildBook.produceMedia(input);
  String result = "book: " + book;
  System.out.println(result);
  assertEquals(result, "book: [item1, item2, item3, item4]");
  }
  
  public void testMagazine() {
  MediaDirector buildMagazine = new MediaDirector(new MagazineBuilder());
  Media magazine = buildMagazine.produceMedia(input);
  String result = "magazine: " + magazine;
  System.out.println(result);
  assertEquals(result, "magazine: [item1, item2, item3, item4]");
  }
  
  public void testWebSite(){
  MediaDirector buildWebSite = new MediaDirector(new WebSiteBuilder());
  Media webSite = buildWebSite.produceMedia(input);
  String result = "web site: " + webSite;
  System.out.println(result);
  assertEquals(result, "web site: [item1, item2, item3, item4]");
  }
  
  public static void main(String[] args) {
  junit.textui.TestRunner.run(BuildMedia.class);
  }
  
  }
  
  在實現的時候,抽象建造角色提供的接口必須足夠普遍,以適應不同的具體建造角色。對于一個建造角色來說可能某個步驟是不需要的,可以將此接口實現為空。多個產品之間可能沒有太多的共同點,可以提供一個標示接口作為抽象產品角色;也可以不提供抽象產品角色,這時要將提供產品的接口從抽象建造角色里面去掉,不然就會編譯出問題。
  
  四、應用優點
  建造模式可以使得產品內部的表象獨立變化。在原來的工廠方法模式中,產品內部的表象是由產品自身來決定的;而在建造模式中則是“外部化”為由建造者來負責。這樣定義一個新的具體建造者角色就可以改變產品的內部表象,符合“開閉原則”。
  
  建造模式使得客戶不需要知道太多產品內部的細節。它將復雜對象的組建和表示方式封裝在一個具體的建造角色中,而且由指導者來協調建造者角色來得到具體的產品實例。
  
  每一個具體建造者角色是毫無關系的。
  
  建造模式可以對復雜產品的創建進行更加精細的控制。產品的組成是由指導者角色調用具體建造者角色來逐步完成的,所以比起其它創建型模式能更好的反映產品的構造過程。
  
  五、擴展
  建造模式中很可能要用到組成成品的各種組件類,對于這些類的創建可以考慮使用工廠方法或者原型模式來實現,在必要的時候也可以加上單例模式來控制類實例的產生。但是要堅持一個大前提就是要使引入的模式給你的系統帶來好處,而不是臃腫的結構。 建造模式在得到復雜產品的時候可能要引用多個不同的組件,在這一點上來看,建造模式和抽象工廠模式是相似

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
96pao国产成视频永久免费| 久精品免费视频| 久久精品91久久久久久再现| 亚洲国产精品成人va在线观看| 亚洲国产婷婷香蕉久久久久久| 色伦专区97中文字幕| 精品国产31久久久久久| 久久久久久久影视| 成人免费自拍视频| 亚洲欧洲偷拍精品| 国产亚洲精品久久| 91av在线不卡| 久久在线免费观看视频| 亚洲国产精品成人一区二区| 亚洲欧美日韩在线高清直播| 国产精品视频成人| 亚洲成人教育av| 欧美激情一二区| 日韩美女在线观看一区| 日韩中文字幕在线| 亚洲大胆人体视频| 久久视频在线看| 日韩精品在线免费观看| 欧美精品在线观看91| 久久久久久国产精品美女| 亚洲福利在线播放| 91欧美激情另类亚洲| 国产999精品久久久影片官网| 欧美日韩国产麻豆| 亚洲精品免费网站| 亚洲视频在线观看免费| 日韩在线观看免费网站| 4438全国成人免费| 国产亚洲在线播放| 亚洲乱码国产乱码精品精天堂| 亚洲人成77777在线观看网| 亚洲老板91色精品久久| 亚洲成av人乱码色午夜| 一夜七次郎国产精品亚洲| 97国产成人精品视频| 91av在线播放视频| 欧美电影在线观看网站| 国产精品自产拍在线观看| 91九色国产社区在线观看| 色婷婷av一区二区三区在线观看| 国产精品91久久| 国产精品久久国产精品99gif| 日韩女优人人人人射在线视频| 欧洲成人免费视频| 日本韩国在线不卡| 欧美日韩国产二区| 亚洲精品短视频| 国产精品久久久久av| 亚洲性av在线| 国产精品亚洲欧美导航| 欧美怡红院视频一区二区三区| 91精品久久久久久久久久久久久| 日韩精品欧美国产精品忘忧草| 国产精品精品视频一区二区三区| 成人欧美一区二区三区黑人| 中文字幕久久久| 日本午夜精品理论片a级appf发布| 国产精品成av人在线视午夜片| 亚洲人成人99网站| 欧美人与性动交| 亚洲精品一区二区在线| 久久综合伊人77777蜜臀| 亚洲天天在线日亚洲洲精| 91免费看视频.| 亚洲人av在线影院| 成年无码av片在线| 中文字幕av一区二区三区谷原希美| 国产99在线|中文| 亚洲伊人成综合成人网| 国产免费一区二区三区在线观看| 91精品久久久久久久久中文字幕| 日韩在线视频二区| 国产精品欧美一区二区三区奶水| 欧美激情极品视频| 日韩精品福利在线| 7m精品福利视频导航| 久久久久久久久久国产| 91精品国产自产91精品| 欧美一级电影久久| 国产精品黄色av| 国产日韩在线视频| 成人午夜两性视频| 亚洲欧美在线免费| 国产欧美亚洲视频| 国产精品久久久久久久电影| 欧美黑人一区二区三区| 91免费看片网站| 日韩欧美极品在线观看| 亚洲精品美女久久久久| 91在线观看免费高清完整版在线观看| 91亚洲国产成人久久精品网站| 日韩一区视频在线| 91亚洲午夜在线| 欧美日韩午夜剧场| 欧美福利视频网站| 91亚洲精品在线观看| 久久影视电视剧免费网站| 国产欧美日韩91| 一区二区中文字幕| 国产91网红主播在线观看| 国产精品∨欧美精品v日韩精品| 影音先锋欧美精品| 国模视频一区二区三区| 国产精品久久久久久久久久小说| 久久777国产线看观看精品| 亚洲最新av在线| 亚洲欧美日韩直播| 国产精品白嫩美女在线观看| 亚洲电影免费观看| 一本大道久久加勒比香蕉| 91在线无精精品一区二区| 亚洲欧美日韩精品久久| 亚洲美女喷白浆| 色妞一区二区三区| 欧美片一区二区三区| 高清欧美一区二区三区| 亚洲自拍偷拍在线| 韩剧1988在线观看免费完整版| 亚洲一区二区免费在线| 国产在线不卡精品| 91在线精品播放| 亚洲国产日韩一区| 91久久综合亚洲鲁鲁五月天| 欧美孕妇孕交黑巨大网站| 国模精品视频一区二区三区| 国产精品久久久久久久app| 国产一区二区三区视频| 亚洲日韩欧美视频| 国产精品欧美久久久| 国产中文欧美精品| 夜夜嗨av色综合久久久综合网| 免费av在线一区| 在线观看91久久久久久| 91在线观看免费高清完整版在线观看| 国产精品99久久久久久久久| 91色精品视频在线| 亚洲精品国产拍免费91在线| 狠狠躁天天躁日日躁欧美| 深夜福利一区二区| 亚洲最大福利视频网| 免费不卡欧美自拍视频| 久久亚洲电影天堂| 亚洲自拍偷拍色图| 中文字幕久久久| 精品视频一区在线视频| 久久91亚洲精品中文字幕| 在线观看精品国产视频| 亚洲精品美女久久久久| 亚洲成人a级网| 欧美成人精品三级在线观看| 欧美性猛交xxxx乱大交极品| 97成人超碰免| 日韩欧美国产激情| 国产精品xxx视频| 亚洲加勒比久久88色综合| 国产精品视频成人| 91久久久国产精品| 欧美性20hd另类| 日韩欧美高清视频|