網(wǎng)站首頁 編程語言 正文
創(chuàng)建型設(shè)計模式之建造者模式
- 建造者模式
- 概述
- 角色
- 優(yōu)缺點
- 應(yīng)用場景
- 基本使用
- 創(chuàng)建產(chǎn)品類
- 創(chuàng)建建造者類
- 使用
- 鏈?zhǔn)綄懛?/li>
- 創(chuàng)建產(chǎn)品類與建造者類
- 使用
建造者模式
概述
建造者模式(Builder Pattern)屬于
創(chuàng)建型模式
。
它是將一個復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
簡而言之:建造者模式就是使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。
建造者模式適用于創(chuàng)建對象需要很多步驟,但是步驟的順序不一定固定。如果一個對象有非常復(fù)雜的內(nèi)部結(jié)構(gòu)(很多屬性),可以將復(fù)雜對象的創(chuàng)建和使用進行分離。
JDK的StringBuilder類中
append()方法
,提供了開放構(gòu)造步驟,最后調(diào)用toString0方法就可以獲得一個構(gòu)造好的完整字符串。其就是一個建造者模式的體現(xiàn)。
角色
建造者模式提供四個主要角色:
1.產(chǎn)品(Product)
要創(chuàng)建的產(chǎn)品類對象。
2.建造者抽象(Builder)
建造者的抽象類,規(guī)范產(chǎn)品對象的各個組成部分的建造,一般由子類實現(xiàn)具體的建造過程。
3.建造者(ConcreteBuilder)
具體的Builder類,根據(jù)不同的業(yè)務(wù)邏輯,具體化對象的各個組成部分的創(chuàng)建。
4.調(diào)用者(Director)
調(diào)用具體的建造者,來創(chuàng)建對象的各個部分,在指導(dǎo)者中不涉及具體產(chǎn)品的信息,只負(fù)責(zé)保正對象各部分完整創(chuàng)建或按某種順序創(chuàng)建。
優(yōu)缺點
優(yōu)點:
1.封裝性好,創(chuàng)建和使用分離。
2.擴展性好,建造類之間獨立、一定程度上解耦。
缺點:
1.產(chǎn)生多余的Builder對象。
2.產(chǎn)品內(nèi)部發(fā)生變化,建造者都要修改,成本較大。
應(yīng)用場景
1.需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2.需要生成的對象內(nèi)部屬性本身相互依賴。
3.相同的方法,不同的執(zhí)行順序,產(chǎn)生不同的結(jié)果。
4.當(dāng)初始化一個對象特別復(fù)雜,參數(shù)多,而且很多參數(shù)都具有默認(rèn)值時。
基本使用
生產(chǎn)一輛Car的過程,需要一系列的步驟,假設(shè)這些步驟可以隨意調(diào)整組合。
創(chuàng)建產(chǎn)品類
public class Car {
/**
* 名稱
*/
private String name;
/**
* 顏色
*/
private String color;
/**
* 價格
*/
private String price;
/**
* 類型
*/
private String type;
/**
* 發(fā)動機
*/
private String engine;
/**
* 輪子
*/
private String wheel;
}
創(chuàng)建建造者類
創(chuàng)建建造者類,將復(fù)雜的構(gòu)造過程封裝起來,構(gòu)造步驟由使用者決定
public class CarBuilder {
private Car car = new Car();
public CarBuilder addName(String name) {
car.setName(name);
return this;
}
public CarBuilder addColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder addPrice(String price) {
car.setPrice(price);
return this;
}
public CarBuilder addType(String type) {
car.setType(type);
return this;
}
public CarBuilder addEngine(String engine) {
car.setEngine(engine);
return this;
}
public CarBuilder addWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public Car build() {
return car;
}
}
使用
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
Car car = carBuilder.addName("奔馳")
.addColor("紅色")
.addPrice("100萬")
.addType("轎車")
.addEngine("1.8T")
.addWheel("18寸")
.build();
System.out.println(car);
}
鏈?zhǔn)綄懛?/h1>
建造者模式通常是采用鏈?zhǔn)骄幊痰姆绞綐?gòu)造對象。
建造者模式通常是采用鏈?zhǔn)骄幊痰姆绞綐?gòu)造對象。
具體做法:
將產(chǎn)品類添加到建造者類中作為內(nèi)部類,然后將構(gòu)造步驟添加進去,完成每個步驟,都返回this關(guān)鍵字。
創(chuàng)建產(chǎn)品類與建造者類
public class CarBuilder {
@Data
public class Car {
/**
* 品牌
*/
private String name;
/**
* 顏色
*/
private String color;
/**
* 價格
*/
private String price;
/**
* 類型
*/
private String type;
/**
* 發(fā)動機
*/
private String engine;
/**
* 輪子
*/
private String wheel;
}
private Car car = new Car();
public CarBuilder addName(String name) {
car.setName(name);
return this;
}
public CarBuilder addColor(String color) {
car.setColor(color);
return this;
}
public CarBuilder addPrice(String price) {
car.setPrice(price);
return this;
}
public CarBuilder addType(String type) {
car.setType(type);
return this;
}
public CarBuilder addEngine(String engine) {
car.setEngine(engine);
return this;
}
public CarBuilder addWheel(String wheel) {
car.setWheel(wheel);
return this;
}
public Car build() {
return car;
}
}
使用
public static void main(String[] args) {
CarBuilder carBuilder = new CarBuilder();
carBuilder.addName("奔馳").addColor("紅色").addPrice("100萬").addType("跑車").addEngine("發(fā)動機").addWheel("輪子");
CarBuilder.Car car = carBuilder.build();
System.out.println(car);
}
原文鏈接:https://blog.csdn.net/qq_38628046/article/details/126087259
相關(guān)推薦
- 2023-08-12 thinkadmin 單頁面多個富文本初始化
- 2022-11-04 React組件化學(xué)習(xí)入門教程講解_React
- 2023-10-11 Mybatis-Plus條件構(gòu)造器的select
- 2022-07-21 安裝MiniConda和Pytorch以及Cuda的筆記及心得
- 2022-11-11 Python?GUI程序類寫法與Label介紹_python
- 2022-11-19 python中celery的基本使用詳情_python
- 2022-06-01 Python讀取csv文件做K-means分析詳情_python
- 2022-09-29 OpenCV中Grabcut算法的具體使用_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支