狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

基于Java的建造設計模式

基于Java的建造設計模式

更新時間:2020-01-02 文章作者:未知 信息來源:網絡 閱讀次數:

一、引子

  前幾天陪朋友去裝機店攢了一臺電腦,看著裝機工在那里熟練的裝配著機器,不禁想起來了培訓時講到的建造模式。作為裝機工,他們不用管你用的CPU是Intel還是AMD,也不管你的顯卡是2000千大元還是白送的,都能攣宄淖芭湓諞黃稹惶≒C就誕生了!當然對于客戶來說,你也不知道太多關于PC組裝的細節。這和建造模式是多么的相像啊!

  今天就來探討一下建造模式

  二、定義與結構

  GOF給建造模式的定義為:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。可以將建造模式的精髓概括為:將構造復雜對象的過程和對象的部件解耦。這是對降低耦合、提高可復用性精神的一種貫徹。其實這種精神貫徹在GOF幾乎所有的設計模式中。

  是不是和上面提到的裝機流程相像?

  這個很多人認為同抽象工廠模式相似的建造模式用在什么樣的設計環境下呢(對于兩者的比較稍候討論)?我認為可以總結為以下環境:當要生成的產品有復雜的內部結構,其中的內部結構由多個對象組成;系統將來可能要改變產品對象的內部結構的構成或者實現方式,比如說產品的一些屬性現在是從數據庫中得到的,而將來可能從XML中解析得到;而且不能將產品的內部構造完全暴露給客戶程序,一是為了可用性,二是為了安全等因素。滿足上面的設計環境就可以考慮使用建造模式來搭建框架了。 來看看建造模式的組成吧。

  抽象建造者角色:這個角色用來規范產品對象的各個組成成分的建造。一般而言,此角色獨立于應用程序的商業邏輯。

  具體建造者角色:擔任這個角色的是于應用程序緊密相關的類,它們在指導者的調用下創建產品實例。這個角色在實現抽象建造者角色提供的方法的前提下,達到完成產品組裝,提供成品的功能。

  指導者角色:調用具體建造者角色以創建產品對象。指導者并沒有產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。 產品角色:建造中的復雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的接口。

  首先客戶程序創建一個指導者對象,一個建造者角色,并將建造者角色傳入指導者對象進行配置。然后,指導者按照步驟調用建造者的方法創建產品。最后客戶程序從建造者或者指導者那里得到產品。

  從建造模式的工作流程來看,建造模式將產品的組裝“外部化”到了建造者角色中來。這是和任何正規的工廠模式不一樣的——產品的創建是在產品類中完成的。

  三、實現

  實在找不到太好的例子,我認為《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);
  }

  }

  在實現的時候,抽象建造角色提供的接口必須足夠普遍,以適應不同的具體建造角色。對于一個建造角色來說可能某個步驟是不需要的,可以將此接口實現為空。多個產品之間可能沒有太多的共同點,可以提供一個標示接口作為抽象產品角色;也可以不提供抽象產品角色,這時要將提供產品的接口從抽象建造角色里面去掉,不然就會編譯出問題。

  四、應用優點

  建造模式可以使得產品內部的表象獨立變化。在原來的工廠方法模式中,產品內部的表象是由產品自身來決定的;而在建造模式中則是“外部化”為由建造者來負責。這樣定義一個新的具體建造者角色就可以改變產品的內部表象,符合“開閉原則”。

  建造模式使得客戶不需要知道太多產品內部的細節。它將復雜對象的組建和表示方式封裝在一個具體的建造角色中,而且由指導者來協調建造者角色來得到具體的產品實例。

  每一個具體建造者角色是毫無關系的。

  建造模式可以對復雜產品的創建進行更加精細的控制。產品的組成是由指導者角色調用具體建造者角色來逐步完成的,所以比起其它創建型模式能更好的反映產品的構造過程。

  五、擴展

  建造模式中很可能要用到組成成品的各種組件類,對于這些類的創建可以考慮使用工廠方法或者原型模式來實現,在必要的時候也可以加上單例模式來控制類實例的產生。但是要堅持一個大前提就是要使引入的模式給你的系統帶來好處,而不是臃腫的結構。 建造模式在得到復雜產品的時候可能要引用多個不同的組件,在這一點上來看,建造模式和抽象工廠模式是相似的。可以從以下兩點來區分兩者:創建模式著重于逐步將組件裝配成一個成品并向外提供成品,而抽象工廠模式著重于得到產品族中相關的多個產品對象;抽象工廠模式的應用是受限于產品族的(具體參見《深入淺出工廠模式》),建造模式則不會。

  由于建造模式和抽象工廠模式在實現功能上相似,所以兩者使用的環境都比較復雜并且需要更多的靈活性。 建造模式中可能要使用到不同“大小”的組件類,因此這時也經常和合成模式在一起使用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
在线看日韩精品电影| 欧美午夜寂寞影院| 亚洲一区二区三区四区五区中文| 一本色道久久综合亚洲二区三区| 一区二区三区欧美亚洲| 裸体丰满少妇做受久久99精品| 日韩电影在线观看电影| 91精品国产综合久久小美女| av电影在线观看完整版一区二区 | 久久婷婷麻豆| 成人ar影院免费观看视频| 成人美女在线视频| 国产精品每日更新在线播放网址| 在线亚洲精品| 久久国产精品99久久久久久老狼| 91精品欧美福利在线观看| 欧美精品不卡| 亚洲成人高清在线| 欧美一区永久视频免费观看| 欧美精品国产一区| 亚洲成年人影院| 欧美一激情一区二区三区| 欧美日韩国产综合网| 午夜精品123| 欧美成人在线直播| 一区二区三区|亚洲午夜| 91亚洲精品久久久蜜桃| 国产久卡久卡久卡久卡视频精品| 亚洲国产一区二区a毛片| 中文字幕乱码一区二区免费| 欧美一区二区三区在线视频| 欧美日韩国产综合一区二区| 91福利在线看| 国产精品日韩高清| 日韩午夜高潮| 亚洲人成在线影院| 一区二区视频在线观看| 韩日精品视频| 精品成人一区| 国产伦精品一区二区三区视频黑人 | 亚洲图片激情小说| 日韩免费成人网| 亚洲专区一区| 尤物精品在线| 久久综合九色综合欧美就去吻| 国产精品一区三区| 欧美日韩亚洲综合| 亚洲日本视频| 国产麻豆精品一区二区| 一区二区三区.www| 精品国产a毛片| 色婷婷综合久久久久中文| 91视频免费看| 精品一区二区日韩| 一区二区国产视频| 久久久噜噜噜久噜久久综合| 在线中文字幕一区| 亚洲国产一区二区三区在线播| 国产成人99久久亚洲综合精品| 一区二区三区国产豹纹内裤在线| 精品国产伦一区二区三区观看方式 | 国产精品女上位| 欧美人xxxx| 亚洲一区三区视频在线观看| 99久久免费精品| 五月天精品一区二区三区| 久久久精品网| 极品av少妇一区二区| 成人黄色免费短视频| 蜜芽一区二区三区| 亚洲精品菠萝久久久久久久| 国产欧美一区在线| 欧美日韩高清不卡| 久久狠狠婷婷| 亚洲第一在线| 欧美激情偷拍| 成人高清免费在线播放| 国模套图日韩精品一区二区| 亚洲超碰97人人做人人爱| 国产精品国产精品国产专区不片| 日韩一级片网址| 欧美色图12p| 久久综合久久久| 先锋影音国产精品| 日韩午夜av| 精品999在线观看| 色综合久久中文字幕| voyeur盗摄精品| 国产夫妻精品视频| 国产一区二区在线观看免费| 男女男精品视频| 日韩国产在线观看| 婷婷丁香激情综合| 亚洲国产精品一区二区尤物区| 亚洲品质自拍视频网站| 中文字幕欧美区| 国产亚洲成av人在线观看导航 | 亚洲欧美国产三级| 日韩美女视频19| 一区精品在线播放| 国产精品久久久久久久久免费丝袜| 国产亚洲精品精华液| 久久九九99视频| 久久久五月婷婷| 久久九九99视频| 日韩国产欧美在线观看| 青青草国产精品亚洲专区无| 五月天久久比比资源色| 亚洲地区一二三色| 日韩电影在线一区| 久久99精品国产.久久久久久| 老色鬼精品视频在线观看播放| 美脚の诱脚舐め脚责91 | 91精品国产91久久久久久最新毛片| 欧美日韩国产综合草草| 欧美一级久久久久久久大片| 精品国产乱码久久久久久久久 | 激情成人综合网| 国产夫妻精品视频| 91香蕉视频污在线| 亚洲图片欧洲图片日韩av| 日韩亚洲一区在线播放| 久久久久成人精品免费播放动漫| 日本久久一区二区| 91精品国产丝袜白色高跟鞋| 精品91自产拍在线观看一区| 欧美国产国产综合| 一区二区三区精品久久久| 天天影视色香欲综合网老头| 国内成+人亚洲+欧美+综合在线| 国产精品亚洲а∨天堂免在线| www.日韩大片| 亚洲国产精品毛片| 日本精品免费观看高清观看| 欧美久久久久久久久久| 久久综合狠狠综合久久综合88| 亚洲国产精品二十页| 一区二区三区中文在线| 麻豆高清免费国产一区| 99综合电影在线视频| 亚洲国产激情| 欧美色区777第一页| 精品免费日韩av| 亚洲另类春色国产| 另类中文字幕网| 91美女片黄在线观看| 一二三区精品| 777色狠狠一区二区三区| 中文字幕第一区第二区| 日韩精品视频网站| 成人av动漫在线| 一区二区三区欧美成人| 欧美日韩精品一区二区在线播放| 国产偷v国产偷v亚洲高清| 亚洲自拍偷拍九九九| 国产精品一区二区在线播放| 国产一区激情| 欧美午夜电影在线播放| 国产视频一区不卡| 日日摸夜夜添夜夜添亚洲女人| 成人福利在线看| 国产欧美综合一区二区三区| 欧美一区二区视频在线观看2020| 日韩美女啊v在线免费观看| 久久成人免费网站| 一区久久精品| 91精品久久久久久蜜臀| 亚洲人成精品久久久久久 | 欧美激情四色| 欧美日韩高清在线| 亚洲欧美在线高清| 国产精品一二三四五| 国产亚洲永久域名| 欧美tk—视频vk| 日韩成人av影视| 欧美日韩在线大尺度| 欧美日韩精品一区二区| 亚洲欧美日韩一区二区| 国产91精品欧美| 久久精品一区| 国产精品久久久久久久岛一牛影视| 精一区二区三区| 国产亚洲一区二区三区在线播放| 精品成人免费观看| 麻豆精品国产传媒mv男同| 夜夜爽99久久国产综合精品女不卡| 欧美成人女星排行榜| 日韩av不卡在线观看| 亚洲精品美女91| 久久这里只精品最新地址| 精品在线免费观看| 国产亚洲成人一区| 国产女主播在线一区二区| 国内精品第一页| 久久综合九色综合久99| 亚洲欧美二区三区| 欧美三级特黄| 久久丝袜美腿综合| 国产成人亚洲综合a∨婷婷图片| 日本乱人伦aⅴ精品|