🌲本文收錄于專欄《原始碼中的設計模式》——理論與實戰的完美結合
作者其它優質專欄推薦:
📚《技術專家修煉》——搞技術,進大廠,聊人生三合一專欄
📚《leetcode 300題》——每天一道演算法題,進大廠必備
📚《糊涂演算法》——從今天起,邁過資料結構和演算法這道坎
📚《從實戰學python》——Python的爬蟲,自動化,AI等實戰應用(代碼開源)
點擊跳轉到文末領取粉絲福利
哈嘍,大家好,我是一條~
之前的《白話設計模式》因為作業被擱置,如今再次啟航,并搭配框架原始碼決議一起食用,將理論與實戰完美結合,
對設計模式不是很熟悉的同學可以先看一下《23種設計模式的一句話通俗解讀》全面的了解一下設計模式,形成一個整體的框架,再逐個擊破,
上期原型模式發布以后,收到了粉絲的感謝,一條創作的動力更足了,

今天我們一塊看一下建造者模式,同樣是創建型設計模式,

定義
官方定義
將一個復雜物件的構建與它的表示分離,使得同樣的構建程序可以創建不同的表示,
通俗解讀
提供一種創建物件的方式,創建的東西細節復雜,還必須暴露給使用者,屏蔽程序而不屏蔽細節,
類似建房子,只需要把材料和設計圖紙給工人,就能建成想要的房子,不關注工人建房子的程序,但對于細節,我們又可以自己設計,
結構圖

代碼演示
本文原始碼:建造者模式 提取碼: vpqt
目錄結構
建議跟著一條學設計模式的小伙伴都建一個maven工程,并安裝lombok依賴和插件,
并建立如下包目錄,便于歸納整理,
pom如下
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
開發場景
現在有一個手機的建造者,我要讓它為我生產不用品牌和配置的手機,該怎么實作?
代碼演示
1.創建手機類
@Data
public class Phone {
//處理器
protected String cpu;
//記憶體
protected String mem;
//磁盤
protected String disk;
//螢屏大小
protected String size;
}
2.創建建造者介面
//定義建造者的模板方法
public interface Builder {
Phone phone = new Phone();
void buildCpu(String cpu);
void buildMem(String mem);
void buildDisk(String disk);
void buildSize(String size);
default Phone getPhone(){
return phone;
}
}
3.創建Vivo手機的建造者
public class VivoPhoneBuilder implements Builder{
//建造者細節的實作
@Override
public void buildCpu(String cpu) {
phone.cpu=cpu;
}
@Override
public void buildMem(String mem) {
phone.mem=mem;
}
@Override
public void buildDisk(String disk) {
phone.disk=disk;
}
@Override
public void buildSize(String size) {
phone.size=size;
}
}
4.創建測驗類
public class MainTest {
public static void main(String[] args) {
VivoPhoneBuilder builder = new VivoPhoneBuilder();
builder.buildCpu("888");
builder.buildDisk("512");
builder.buildMem("16");
builder.buildSize("plus");
Phone phone = builder.getPhone();
System.out.println(phone);
}
}
5.輸出結果

如果我這時需要生產OPPO手機,只需新建一個OppoPhoneBuilder實作Builder介面即可,
鏈式呼叫
相信大家在開發中都遇見過這樣的代碼,像鏈子一樣可以一直呼叫下去,

那么如何實作鏈式建造者呢?
有以下兩種方式:
1.修改回傳值為Builder
public interface Builder {
Phone phone = new Phone();
// void 改為 Builder 同步修改實作類
Builder buildCpu(String cpu);
Builder buildMem(String mem);
Builder buildDisk(String disk);
Builder buildSize(String size);
default Phone getPhone(){
return phone;
}
}
測驗1
public class MainTest {
public static void main(String[] args) {
// ……
VivoPhoneBuilder builder2 = new VivoPhoneBuilder();
Phone phone1 = builder2
.buildCpu("888")
.buildDisk("512")
.buildMem("16")
.buildSize("plus")
.getPhone();
System.out.println("phone1:"+phone1);
}
}
結果1

2.使用lombok
@Data
@Builder //使用鏈式建造者
@NoArgsConstructor
@AllArgsConstructor
public class Phone {
// ……
}
測驗2
public class MainTest {
public static void main(String[] args) {
// ……
Phone build = Phone.builder()
.cpu("888")
.mem("16")
.disk("512")
.size("plus").build();
System.out.println("builder:"+build);
}
}
結果2

應用場景
- StringBuilder:
append();給誰append呢?
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
- Swagger-ApiBuilder;
- 快速實作:
Lombok-@Builder
總結
建造者模式提供了對于同一構建程序的不同表示,像流水線一樣生產物件,對于新增的物件,只需要創建對應的建造者即可,不需要修改源代碼,
lombok為我們提供了建造者模式的快速實作(@Builder),要應用到實際編碼中,
粉絲福利
📚Java:1.5G學習資料——回復「資料」
📚演算法:視頻書籍——回復「演算法」
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/304332.html
標籤:python
上一篇:【小白+python+selenium庫+圖片爬取+反爬+資料】超詳細新手實作(01)webdriver環境配置+新手基礎知識
