Java建造者模式在專案中的實際運用
建造者模式
建造者模式(Builder Pattern)是物件建立軟體設計模式,其目的是找到伸縮構造器反模式的解決方案。先簡單說一下伸縮構造器反模式是什麼:假如我們有如下建構函式:
public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {
}
可以看到,建構函式引數的數量很多,而且將來可能會新增更多的引數,這就已經很難去控制數量了。並且在使用建構函式的時候很難理解引數的排列順序,這就可稱之為伸縮構造器反模式。
所以建造者模式的目的就是將複雜物件的構造與其表示分開,以便相同的構造過程可以建立不同的表示。
簡單來說,建造者模式允許建立不同風格的物件,同時避免建構函式汙染,這在有多種建構函式或者建立物件涉及許多步驟時很有用。
下面用實際例子來說明:
/**
* @Author: BaiDing
* @Date: 2018/9/20 13:42
* @Email: [email protected]
*/
public class QueryPaginationResponse implements Serializable{
private int status; // 查詢是否成功 1,0
private int current; // 當前頁
private int total; // 總頁數
private int count; // 總記錄數
private int pageSize; // 一頁的記錄數
private List<Object> list; // 得到的資料
public QueryPaginationResponse(int status){
this.status = status;
}
public int getStatus() {
return status;
}
public void setStatus (int status) {
this.status = status;
}
public int getCurrent() {
return current;
}
public void setCurrent(int current) {
this.current = current;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<Object> getList() {
return list;
}
public void setList(List<Object> list) {
this.list = list;
}
@Override
public String toString() {
return "QueryPaginationResponse{" +
"status=" + status +
", current=" + current +
", total=" + total +
", count=" + count +
", pageSize=" + pageSize +
", list=" + list +
'}';
}
public static class Builder {
private QueryPaginationResponse instance;
public Builder(QueryPaginationResponse q){this.instance = q;}
public Builder(int status){
this(new QueryPaginationResponse(status));
}
public Builder setCurrent(int current){
this.instance.current = current;
return this;
}
public Builder setTotal(int total){
this.instance.total = total;
return this;
}
public Builder setCount(int count){
this.instance.count = count;
return this;
}
public Builder setPageSize(int pageSize){
this.instance.pageSize = pageSize;
return this;
}
public Builder setList(List<Object> list){
this.instance.list = list;
return this;
}
public QueryPaginationResponse build(){
return this.instance;
}
}
}
QueryPaginationResponse response = new QueryPaginationResponse.Builder(1).setCount(100)
.setCurrent(1).setTotal(2).setPageSize(50).setList(new ArrayList<>()).build();
System.out.println(response.toString());
在以往,當我們需要new一個QueryPaginationResponse物件的時候,往往直接呼叫建構函式生成一個物件,如:
public QueryPaginationResponse(int status, int current, int total, int count) {
this.status = status;
this.current = current;
this.total = total;
this.count = count;
}
當成員屬性只有上述四個的時候,建構函式也只有四個引數。但當加了一個成員屬性pageSize的話,那麼就要修改建構函式,或者過載建構函式
public QueryPaginationResponse(int status, int current, int total, int count, int pageSize) {
this.status = status;
this.current = current;
this.total = total;
this.count = count;
this.pageSize = pageSize;
}
若是又增加了一個屬性的話,那麼還得重複上述步驟,修改或者過載:
public QueryPaginationResponse(int status, int current, int total, int count, int pageSize, List<Object> list) {
this.status = status;
this.current = current;
this.total = total;
this.count = count;
this.pageSize = pageSize;
this.list = list;
}
這就為程式碼的呼叫帶來了大大的不便。
Builder模式就可以用來解決這種複雜的物件構造邏輯。
從上述展示的例子程式碼可以看到,在QueryPaginationResponse類內部,我們新建了一個內部類Builder,Builder類內部含有一個QueryPaginationResponse型別的屬性。Builder類內部有兩個建構函式,其目的就是例項化這個QueryPaginationResponse型別的屬性。
public static class Builder {
private QueryPaginationResponse instance;
public Builder(QueryPaginationResponse q){this.instance = q;}
public Builder(int status){
this(new QueryPaginationResponse(status));
}
之後就是建立QueryPaginationResponse物件各個屬性的賦值方法了,方法名隨意,但是這些賦值方法都是給這個Builder物件連續呼叫的,所以方法內部還得返回這個Builder物件return this;
。
public Builder setTotal(int total){
// 實質給QueryPaginationResponse例項賦值
this.instance.total = total;
return this;
}
public Builder setCount(int count){
this.instance.count = count;
return this;
}
public Builder setPageSize(int pageSize){
this.instance.pageSize = pageSize;
return this;
}
public Builder setList(List<Object> list){
this.instance.list = list;
return this;
}
最後宣告一個方法將這個Builder類內部的例項返回出去就可以了
public QueryPaginationResponse build(){
return this.instance;
}
最終程式碼就是這個樣子,採用Builder設計模式。當我們需要建立不同風格的物件時候,不再需要過載構造函數了,只需要確定Builder例項呼叫哪個賦值方法就可以了。
// 給5個屬性的QueryPaginationResponse例項
QueryPaginationResponse response = new QueryPaginationResponse.Builder(1).setCount(100)
.setCurrent(1).setTotal(2).setPageSize(50).setList(new ArrayList<>()).build();
// 給4個屬性的QueryPaginationResponse例項
QueryPaginationResponse response = new QueryPaginationResponse.Builder(1).setCount(100)
.setCurrent(1).setTotal(2).setPageSize(50).build();
相關推薦
Java建造者模式在專案中的實際運用
建造者模式 建造者模式(Builder Pattern)是物件建立軟體設計模式,其目的是找到伸縮構造器反模式的解決方案。先簡單說一下伸縮構造器反模式是什麼:假如我們有如下建構函式: public Hero(Profession profession, Strin
Java建造者模式原型和鏈式變種
建造者最開始有4個角色 1.使用者client,提出造房子 Room的需求 2.設計者,Designer,出圖紙,指揮包工頭幹,持有包工頭 3.包工頭, interface Build,擁有步驟和返回房子Room 4.Room,最終的產品 程式碼從client開始 p
Java 建造者模式
簡介 建造者模式(Builder Pattern)是使用多個簡單的物件一步一步構建成一個複雜的物件的一種設計模式,是Java23種設計模式中的一種。 使用方式如下: Student student = new Student.Builder()
JAVA建造者模式
一:建造者模式的角色定義,在建造者模式中存在以下4個角色: 1 builder:為建立一個產品物件的各個部件指定抽象介面。 2 ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個部件,定義並明確它所建立的表示,並提供一個檢索產品的介面。
對Java建造者模式(Builder)的一點理解
一,Builder模式介紹 Builder模式是一步一步建立一個複雜物件的建立型模式,它允許使用者在不知道內部建造細節的情況下,可以更精細的控制物件的構造流程。該模式是為了將構建複雜物件的過程和它的部件解耦,是的構建過程和不見得表示隔離開來。 因為一個複雜的物件有
Java中的設計模式(八):建造者模式
伸縮 null clas 示例代碼 最簡 裝配 角色扮演 app 但是 介紹 今天我們將研究java中的Builder模式。Builder 設計模式是一種創造性的設計模式,如工廠模式和抽象工廠模式。 當Object包含許多屬性時,引入了Builder模式來解決Factory
NO3-java中設計模式之建造者模式
說明 參考文獻:http://www.runoob.com/design-pattern/builder-pattern.html 上邊的這個菜鳥教程是真的不錯,我也是借花獻佛,只是自己寫了一哈,加上自己的理解和程式碼註釋來分享一下心得吧!免得以後忘了。 建造者模式的理解 建造者模式
Java中設計模式(八):建造者模式
介紹 今天我們將研究java中的Builder模式。Builder 設計模式是一種創造性的設計模式,如工廠模式和抽象工廠模式。 當Object包含許多屬性時,引入了Builder模式來解決Factory和Abstract Factory設計模式的一些問題。 當Object包含許多屬性時,Factory和Abs
Java中的建造者模式
11.1 變化是永恆的 又是一個週三,快要下班了,老大突然拉住我,喜滋滋地告訴我:“牛叉公司很滿意我們做的模型,又簽訂了一個合同,把賓士、寶馬的車輛模型都交給我們公司製作了,不過這次又額外增加了一個新需求:汽車的啟動、停止、喇叭聲音、引擎聲音都由客戶自己控制,他想什麼順序就什麼順序,這個沒問題吧?
Java設計模式菜鳥系列(十五)建造者模式建模與實現
郵箱 system for face tom 建造者模式 data mar 方法 轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工廠類模式提供的
建造者模式—設計角度重溫DNF中的角色
必須 face head sta 嘟嘟 裝備 body 控制 客戶 應用場景 假設現在我們要設計DNF中的人物角色(鬼劍士、神槍手、魔法師、聖騎士、格鬥家)。然而,利用面對對象的思想,必須先從實體入手,每一個角色都包含各種裝備、武器、配飾,這些就當做要建造的零
建造者模式(Java與Kotlin版)
blank 客戶 arr 它的 truct rac 簡單工廠 集合 att 前文推送 設計模式 簡單工廠模式(Java與Kotlin版) 工廠方法模式(Java與Kotlin版) 抽象工廠模式(Java與Kotlin版) Kotlin基礎知識 Kotlin入門第一課
Java設計模式學習筆記,三:建造者模式
() stat sys pri builder 統一 return tengine str 建造者模式:實現了構建和裝配的解耦,即對象的各個子組件單獨構建,再進行裝配,從而建造完整對象。 該模式適用於構建較為復雜的對象(多個子組件)。 不同的構建者,使用相同的裝配者,可以建
Java設計模式百例 - 建造者模式
java設計模式本文源碼見:https://github.com/get-set/get-designpatterns/tree/master/builder建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象,這種類型的設計模式屬於創建型模式。建造模式可以將一個復雜對象
java設計模式3.建造者模式、原型模式
原型模式 情況 nbsp 寫到 指向 應用程序 模式 接口 抽象 建造者模式 一個產品常有不同的組成部分作為產品的零件,有些情況下,一個對象會有一些重要的性質,在它們沒有恰當的值之前,對象不能作為一個完整的產品使用,有些時候,一個對象的一些性質必須按照某個順序賦值才有意
Java設計模式(四)之建立型模式:建造者模式
一、定義: 建造者模式將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。 建造者模式的UML結構圖: 建造者模式主要包含四個角色: Builder:抽象建造者。它宣告為建立一
建造者模式:設計角度重溫遊戲中的角色
應用場景 假設現在我們要設計DNF中的人物角色(鬼劍士、神槍手、魔法師、聖騎士、格鬥家)。然而,利用面對物件的思想,必須先從實體入手,每一個角色都包含各種裝備、武器、配飾,這些就當做要建造的零件,然後把裝備零件組裝起來,那麼就是最終人物角色的能量值,然後它就將造成不同的傷害。 回憶
JAVA設計模式之模板方法模式和建造者模式
一、前期回顧 上一篇《Java 設計模式之工廠方法模式與抽象工廠模式》介紹了三種工廠模式,分別是工廠方法模式,簡單工廠方法模式,抽象工廠模式,文中詳細根據實際場景介紹了三種模式的定義,實踐,最後總結了三種方式的區別,以及各個模式的適用場景。這一篇博文我們來學習下模板方法模式和建造者模式。
java設計模式精講 Debug 方式+記憶體分析 第7章 建造者模式
建造者模式 7-1 建造者模式講解 7-2 建造者模式coding 7-3 建造者模式原始碼解析(jdk+guava+spring+mybatis) 7-1 建造者模式講解 7-2 建造者
java設計模式——建造者模式
一. 定義與型別 定義:將一個複雜物件的構建與它的表示分離,使用同樣的構建過程可以建立不同的表示 使用者只需制定需要建造的型別就可以得到它們,建造過程以及細節不需要知道 型別:建立型 建造者模式與工廠模式比較相近,它們的區別在於, 建造者模式注重方法的呼叫順序,工廠模式注重建立產品 它們的建立力度