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ù)雜,會有很多的建造類。
使用場景
1.需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)。
2.需要生成的對象內(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í)例對象并賦值 * * @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 中安裝插件,具體方法,請百度。
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)用方法也是一樣的。
三、測試
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é)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot連接MYSQL數(shù)據(jù)庫并使用JPA進(jìn)行操作
今天給大家介紹一下如何SpringBoot中連接Mysql數(shù)據(jù)庫,并使用JPA進(jìn)行數(shù)據(jù)庫的相關(guān)操作。2017-04-04Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入
最近在項(xiàng)目開發(fā)中遇到的一個(gè)excel復(fù)雜表頭的導(dǎo)入數(shù)據(jù)庫操作,下面這篇文章主要給大家介紹了關(guān)于Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入的相關(guān)資料,需要的朋友可以參考下2022-06-06關(guān)于@ConditionalOnProperty的作用及用法說明
這篇文章主要介紹了關(guān)于@ConditionalOnProperty的作用及用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java讀取resources中資源文件路徑以及jar中文件無法讀取的解決
這篇文章主要介紹了Java讀取resources中資源文件路徑以及jar中文件無法讀取的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05kafka消費(fèi)者kafka-console-consumer接收不到數(shù)據(jù)的解決
這篇文章主要介紹了kafka消費(fèi)者kafka-console-consumer接收不到數(shù)據(jù)的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03