設計模式實戰——開發中常常涉及到的建造者模式

本系列博客是本身在學習設計模式過程當中收集整理的文章集合,其餘文章參看設計模式傳送門html

建造者模式簡介

建造者模式是一種建立型設計模式,這種模式具備很好的封裝性。使用建造者模式能夠有效的封裝變化,在使用建造者模式的場景中,通常產品類和建造者類是比較穩定的,所以,將主要的業務邏輯封裝在導演類中對總體而言能夠取得比較好的穩定性。sql

在建造者模式中,客戶端沒必要知道產品內部組成的細節,將產品自己與產品的建立過程解耦,使得相同的建立過程能夠建立不一樣的產品對象。設計模式

能夠更加精細地控制產品的建立過程 。將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,也更方便使用程序來控制建立過程。安全

其次,建造者模式很容易進行擴展。若是有新的需求,經過實現一個新的建造者類就能夠完成,基本上不用修改以前已經測試經過的代碼,所以也就不會對原有功能引入風險。符合開閉原則。微信

建造者模式一般包含如下角色cookie

抽象建造者類(builder):爲建立product對象而指定各個組件的抽象接口mybatis

具體建造類(concreteBuilder):實現builder接口,重寫方法構建不一樣的表示app

產品類(product):具體的產品框架

指揮者類(director):構建一個使用builder接口的對象工具

JDK中的建造者模式——StringBuilder

StringBuilder 類是JDK中比較典型的建造者模式的體現。我先看下這個類的類圖:

咱們根據上圖看下各個角色的對應狀況:

  • StringBuilder:指揮者角色,持有具體建造者的引用,因爲StringBuilder繼承了AbstractStringBuilder,這裏StringBuilder經過super來做爲具體建造者的引用。

  • AbstractStringBuilder:具體建造者,它實現了appendable接口的append(Character c)方法。

  • Appendable:抽象建造者,定義了建立對象的接口。

  • String:產品角色。

另外,StringBuffer也是使用了建造者模式。二者的惟一區別就是StringBuffer使用了synchronized來保證線程安全,而StringBuilder不是線程安全的。

其實,建造者模式在咱們平時開發中更多的體現就是像 StringBuilder.append 這樣的鏈式調用。其中StringBuilder就是指揮官角色,append方法是建立產品細節的過程,當咱們建立完產品後就能夠調用toString方法生成具體的產品。好比下面的代碼

String str = new StringBuilder().append()
.append()
.toString();

這樣相似的代碼還有不少,好比

Header header = new HeaderBuilder()
.setClientId(SOAHeader.SOAP_CLIENT_ID)
.setCorrelationId(SOAHeader.SOAP_CORRELATION_ID)
.buildHeader();

在平時開發過程當中,若是咱們看到上面相似的代碼,可能就是用了建造者模式。咱們平時要留意這樣的代碼,看看做者爲何要這樣設計系統,對咱們的代碼提高頗有幫助。這也是我整理總結開發框架中常見設計模式的用意。

Spring中的建造者模式

Spring是Java開發者最經常使用的開發框架。有人說Spring的源代碼就是設計模式的盛宴。看Spring的源代碼是很好的學習設計模式的一種方式。

在Spring框架中,常涉及到的建造者模式有:

  • UriComponentsBuilder

  • BeanDefinitionBuilder

其中 BeanDefinitionBuilder 較底層,咱們平時不太會用到。這裏咱們經過 UriComponentsBuilder 來說述Spring中的建造者模式。

下面的代碼中,咱們Spring中的restTemplate工具調用遠程接口。在調用前須要先構建URL參數。這邊就是使用了 UriComponentsBuilder 來構建的。

UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080").
path("/test").build(true);
URI uri = uriComponents.toUri();

RequestEntity<JSONObject> requestEntity = RequestEntity.post(uri).
//添加cookie(這邊有個問題,假如咱們要設置cookie的生命週期,做用域等參數咱們要怎麼操做)
header(HttpHeaders.COOKIE,"key1=value1").
//添加header
header(("MyRequestHeader", "MyValue")
accept(MediaType.APPLICATION_JSON).
contentType(MediaType.APPLICATION_JSON).
body(requestParam);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(requestEntity,JSONObject.class);
//響應結果
JSONObject responseEntityBody = responseEntity.getBody();

Spring中的設計模式有不少,咱們平時使用時能夠細心關注下。相信確定會有收穫。

MyBatis中的建造者模式

MyBatis中最經典的建造者模式確定是獲取SqlSessionFactory的過程。

下面是獲取SqlSessionFactory的典型用法。

CopyClassPathResource resource = new ClassPathResource("mybatis-config.xml");
InputStream inputStream = resource.getInputStream();
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

經過上面代碼發現,建立SqlSessionFactory的代碼在SqlSessionFactoryBuilder中,進去一探究竟:

Copy//整個過程就是將配置文件解析成Configration對象,而後建立SqlSessionFactory的過程
//Configuration是SqlSessionFactory的一個內部屬性
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}

public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}

代碼比較簡單,就不具體分析了。這裏仍是對號入座,列舉下各個角色。

  • SqlSessionFactoryBuilder:指揮者角色

  • BaseBuilder:抽象Builder

  • XMLConfigBuilder:具體的Builder

  • SqlSessionFactory:須要被建立的產品

感悟

學習設計模式光學習不行,由於這個東西比較抽象。你必須結合具體的項目框架來看纔能有比較深的感悟。

平時若是有空餘時間能夠本身動手,使用設計模式寫一些小的框架。還有就是多看看那些主流開源框架的源代碼,這些代碼中都有很對設計模式的體現。結合設計模式的理論知識,看看這些框架中爲何要用這些模式,比你光看確定收穫要多。

聲明:發佈此文是出於傳遞更多知識以供交流學習之目的。如有來源標註錯誤或侵犯了您的合法權益,請做者持權屬證實與咱們聯繫,咱們將及時更正、刪除,謝謝。

做者:寫代碼的木公

來源:https://www.cnblogs.com/54chensongxia/p/12409493.html

More:【微信公衆號】 u3dnotes

本文分享自微信公衆號 - Unity3D遊戲開發精華教程乾貨(u3dnotes)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索