Java中常用的設(shè)計(jì)模式之建造者模式詳解
優(yōu)點(diǎn)
1.建造者獨(dú)立,易擴(kuò)展。
2.便于控制細(xì)節(jié)風(fēng)險(xiǎn)。
缺點(diǎn)
1.產(chǎn)品必須有共同點(diǎn),范圍有限制。
2.如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類。
使用場(chǎng)景
1.需要生成的對(duì)象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2.需要生成的對(duì)象內(nèi)部屬性本身相互依賴。
一、實(shí)現(xiàn)方式
package com.asurplus.common.builder.style1;
public class UserInfo {
private String name;
private int age;
/**
* 創(chuàng)建一個(gè)新的建造者
*
* @return
*/
public static UserInfoBuilder builder() {
return new UserInfoBuilder();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name +
", age=" + age +
'}';
}
/**
* 建造者內(nèi)部類
*/
public static class UserInfoBuilder {
private String name;
private int age;
public UserInfoBuilder name(String name) {
this.name = name;
return this;
}
public UserInfoBuilder age(int age) {
this.age = age;
return this;
}
/**
* 創(chuàng)建一個(gè)新的實(shí)例對(duì)象并賦值
*
* @return
*/
public UserInfo build() {
UserInfo userInfo = new UserInfo();
userInfo.setName(this.name);
userInfo.setAge(this.age);
return userInfo;
}
}
}
我們定義了一個(gè) UserInfo 類,有 name,age 兩個(gè)屬性,還定義了一個(gè)靜態(tài)內(nèi)部類 UserInfoBuilder,幫助我們建造 UserInfo,并提供鏈?zhǔn)秸{(diào)用的方法。
二、實(shí)現(xiàn)方式
1、引入依賴
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Lombok 需要在 IDEA 中安裝插件,具體方法,請(qǐng)百度。
2、實(shí)現(xiàn)
package com.asurplus.common.builder.style2;
import lombok.Builder;
import lombok.Data;
/**
* get set toString 方法注解
*/
@Data
/**
* 建造者模式注解
*/
@Builder
public class UserInfo2 {
private String name;
private int age;
}
基于 Lombok 的注解,我們省略了大部分代碼,但是具體的實(shí)現(xiàn)方式和我們的方式一是一模一樣的,調(diào)用方法也是一樣的。
三、測(cè)試
package com.asurplus.common.builder;
import com.asurplus.common.builder.style1.UserInfo;
import com.asurplus.common.builder.style2.UserInfo2;
/**
* 建造者模式
*/
public class TestMain {
public static void main(String[] args) {
// 手寫的方式
UserInfo userInfo = UserInfo.builder().name("張三").age(20).build();
System.out.println(userInfo);
// 注解的方式
UserInfo2 userInfo2 = UserInfo2.builder().name("李四").age(30).build();
System.out.println(userInfo2);
}
}
輸出結(jié)果

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解SpringBoot中Controller接收對(duì)象列表實(shí)現(xiàn)
這篇文章主要介紹了詳解SpringBoot中Controller接收對(duì)象列表實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解
這篇文章主要介紹了Java 常用類解析:java異常機(jī)制,異常棧,異常處理方式,異常鏈,異常丟失詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03
Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Bean與Map之間相互轉(zhuǎn)化的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
教你用Java驗(yàn)證服務(wù)器登錄系統(tǒng)
這篇文章主要介紹了教你用Java驗(yàn)證服務(wù)器登錄系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04

