最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式中的建造者(Builder)模式解讀

 更新時(shí)間:2023年10月09日 09:58:47   作者:蠟筆小久  
這篇文章主要介紹了Java設(shè)計(jì)模式中的建造者(Builder)模式解讀, 建造者模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它通過(guò)將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)步驟,并使用一個(gè)建造者類(lèi)來(lái)封裝這些步驟,從而使得對(duì)象的構(gòu)建過(guò)程更加靈活和可擴(kuò)展,需要的朋友可以參考下

為什么需要建造者模式

在我們?nèi)粘5拈_(kāi)發(fā)中,一般使用new 關(guān)鍵字通過(guò)構(gòu)造器就可以實(shí)現(xiàn)對(duì)象的創(chuàng)建,然后通過(guò)set來(lái)實(shí)現(xiàn)成員變量的修改, 為什么在Java中還需要建造者模式來(lái)創(chuàng)建對(duì)象?

假如我們系統(tǒng)中,需要有一個(gè)統(tǒng)一的日志模塊,包含了日志內(nèi)容(content)、日志所屬組織(orgId)、日志來(lái)源(logSource: 如app, 平臺(tái)操作)、用戶(hù)名(username)。

通常情況下我們可以直接通過(guò)定義一個(gè)日志類(lèi), 然后通過(guò)構(gòu)造器的方式, 進(jìn)行參數(shù)設(shè)置。

public class LogEntity {
    @Getter
    private Long id;
    /**
     * 操作時(shí)間
     */
    @Getter
    private String eventDate;
    /**
     * 操作日志模塊: default other
     */
    @Getter
    private String module;
    /**
     * 操作內(nèi)容
     */
    @Getter
    private String message;
    /**
     * IP
     */
    @Getter
    private String ipAddress;
    /**
     * 操作用戶(hù)
     */
    @Getter
    private String username;
    /**
     * 日志所屬組織
     */
    @Getter
    private Long organizationId;
    /**
     * 日志來(lái)源('日志來(lái)源:1:終端上報(bào),2:平臺(tái)下發(fā),3:平臺(tái)操作,4:APP操作')
     */
    @Getter
    private Integer logSource;
    public PlatformLoggerEntity(Long id, String module, String message, Long organizationId, Integer logSource) {
        this.id = id;
        this.module = module;
        this.message = message;
        this.organizationId = organizationId;
        this.logSource = logSource;
    }
}

 現(xiàn)在日志類(lèi),只有5個(gè)參數(shù),參數(shù)的個(gè)數(shù)還在可接受范圍內(nèi),假如后續(xù)LogEntity類(lèi)要進(jìn)行擴(kuò)展, 存儲(chǔ)的參數(shù)變成10個(gè)或則更多, 構(gòu)造器就會(huì)變得很長(zhǎng),并且可讀性和易用性都很變得很差。在使用構(gòu)造器時(shí),還需要記得每個(gè)位置傳遞的是什么字段,如果字段類(lèi)型相同,還有可能出現(xiàn)傳遞錯(cuò)誤的情況。 

你可能會(huì)說(shuō),我們可以通過(guò)set方法來(lái)設(shè)置值,確實(shí),通過(guò)set方法來(lái)設(shè)置值可以避免必填字段和非必填字段問(wèn)題。 代碼的可用性也提高了。

出現(xiàn)的問(wèn)題

1.id作為必填字段,需要寫(xiě)在構(gòu)造器中,如果必填字段過(guò)多,又會(huì)出現(xiàn)構(gòu)造器參數(shù)列表過(guò)長(zhǎng)的問(wèn)題

2. 字段間存在關(guān)聯(lián)關(guān)系,比如logSource是平臺(tái),則需要設(shè)置用戶(hù)的所屬企業(yè)id和用戶(hù)名,  如果我們通過(guò)set來(lái)設(shè)置值,那我們校驗(yàn)的邏輯就沒(méi)有地方放了

3. 如果我們想把LogEntity設(shè)置為不可變對(duì)象,對(duì)象初始化后就不允許改變,那么我們?cè)俦┞秙et方法,就達(dá)到到該效果

因此我們可以通過(guò)建造者模式重寫(xiě)方面的類(lèi), 重寫(xiě)好的類(lèi)如下:

public class PlatformLoggerEntity {
    /**
     * 使用雪花算法生成ID
     */
    @Getter
    private Long id;
    /**
     * 操作時(shí)間
     */
    @Getter
    private String eventDate;
    /**
     * 操作日志模塊: default other
     */
    @Getter
    private String module;
    /**
     * 操作內(nèi)容
     */
    @Getter
    private String message;
    /**
     * IP
     */
    @Getter
    private String ipAddress;
    /**
     * 操作用戶(hù)
     */
    @Getter
    private String username;
    /**
     * 日志所屬組織
     */
    @Getter
    private Long organizationId;
    /**
     * 日志來(lái)源('日志來(lái)源:1:終端上報(bào),2:平臺(tái)下發(fā),3:平臺(tái)操作,4:APP操作')
     */
    @Getter
    private Integer logSource;
    /**
     * 顯示類(lèi)型 0:正常顯示  1:超鏈顯示
     */
    @Getter
    private Integer showType;
    private PlatformLoggerEntity(Builder builder) {
        this.id = IdUtil.next();
        this.username = SystemHelper.getCurrentUserName();
        this.ipAddress = SystemHelper.getIpAddress();
        this.organizationId = builder.organizationId;
        this.module = builder.module.getModule();
        this.message = builder.message;
        this.monitoringOperation = builder.monitoringOperation;
        this.monitorName = builder.monitorName;
        this.plateColor = builder.plateColor;
        this.showType = builder.showType;
        this.eventDate = LocalDateUtils.dateTimeFormat(new Date());
        this.logSource = builder.logSource.getLoggerSource();
    }
    /**
     * @return 創(chuàng)建builder類(lèi)的實(shí)例對(duì)象
     */
    public static Builder newBuilder() {
        return new Builder();
    }
    /**
     * 日誌Builder類(lèi)
     */
    public static class Builder {
        /**
         * 操作日志模塊: default other
         */
        private LoggerModule module;
        /**
         * 操作內(nèi)容
         */
        private String message;
        /**
         * 日志所屬組織
         */
        private Long organizationId;
        /**
         * 日志來(lái)源('日志來(lái)源:1:終端上報(bào),2:平臺(tái)下發(fā),3:平臺(tái)操作,4:APP操作')
         */
        private LoggerSource logSource;
        /**
         * 顯示類(lèi)型 0:正常顯示  1:超鏈顯示
         */
        private Integer showType;
        publick LogEntity build() {
            // 默認(rèn)為平臺(tái)操作
            if (Objects.isNull(logSource)) {
                this.logSource = LoggerSource.PLATFORM_OPERATION;
            }
            if (Objects.isNull(organizationId)) {
                this.organizationId = SystemHelper.getCurrentUserOrgId();
            }
            // 用于前端展示
            if (Objects.isNull(module)) {
                this.module = LoggerModule.DEFAULT;
                this.showType = LoggerConstant.SHOW_TYPE_NORMAL;
            } else if (module.equals(LoggerModule.DEFAULT)) {
                this.showType = LoggerConstant.SHOW_TYPE_NORMAL;
            } else {
                this.showType = LoggerConstant.SHOW_TYPE_HYPERLINK;
            }
            return new PlatformLoggerEntity(this);
        }
        public Builder module(LoggerModule module) {
            this.module = module;
            return this;
        }
        public Builder message(String message) {
            this.message = message;
            return this;
        }
        public Builder organizationId(Long organizationId) {
            this.organizationId = organizationId;
            return this;
        }
        public Builder logSource(LoggerSource logSource) {
            this.logSource = logSource;
            return this;
        }
    }
}

我們重寫(xiě)LogEntity類(lèi)后, 我們可以通過(guò)newBuilder來(lái)獲取內(nèi)部的Builder對(duì)象,并且通過(guò)build函數(shù)來(lái)創(chuàng)建LogEntity對(duì)象。 

1.從上面代碼可以看出LogEntitty所有的成員屬性都只有g(shù)et方法,避免出現(xiàn)隨意修改的情況

2.通過(guò)LogEntity內(nèi)部的Builder類(lèi)中的build() 來(lái)增加了相關(guān)聯(lián)屬性的驗(yàn)證,避免調(diào)用則漏傳或則錯(cuò)傳參數(shù)

總結(jié)

什么情況下我們可以選擇建造者(Builder)模式來(lái)創(chuàng)建對(duì)象, 總結(jié)了一下三點(diǎn):

1.如果類(lèi)中的必填字段過(guò)多,構(gòu)造函數(shù)過(guò)長(zhǎng),生成對(duì)象時(shí)需要校驗(yàn)必填屬性

2.如果字段之間存在關(guān)聯(lián),生成對(duì)象時(shí)進(jìn)行校驗(yàn)。

3.我們需要?jiǎng)?chuàng)建不可變對(duì)象,不能暴露實(shí)體的set方法時(shí)

到此這篇關(guān)于Java設(shè)計(jì)模式中的建造者(Builder)模式解讀的文章就介紹到這了,更多相關(guān)Java建造者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java輸出菱形本身是一個(gè)比較簡(jiǎn)單的問(wèn)題,這是Java初學(xué)者都要編寫(xiě)的一個(gè)算法,下面這篇文章主要給大家介紹了關(guān)于java打印菱形及直角和等腰三角形的方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解

    IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了IDEA調(diào)試技巧條件斷點(diǎn)實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • idea resources目錄下的application.properties不能自動(dòng)提示問(wèn)題

    idea resources目錄下的application.properties不能自動(dòng)提示問(wèn)題

    這篇文章主要介紹了idea resources目錄下的application.properties不能自動(dòng)提示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解Maven項(xiàng)目Dependencies常見(jiàn)報(bào)錯(cuò)及解決方案

    詳解Maven項(xiàng)目Dependencies常見(jiàn)報(bào)錯(cuò)及解決方案

    這篇文章主要介紹了詳解Maven項(xiàng)目Dependencies常見(jiàn)報(bào)錯(cuò)及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring使用AOP完成統(tǒng)一結(jié)果封裝實(shí)例demo

    Spring使用AOP完成統(tǒng)一結(jié)果封裝實(shí)例demo

    這篇文章主要介紹了Spring使用AOP完成統(tǒng)一結(jié)果封裝,本文通過(guò)實(shí)現(xiàn)demo給大家詳細(xì)講解,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫(kù)

    Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫(kù)

    這篇文章主要給大家介紹了關(guān)于Java的JDBC編程使用之連接Mysql數(shù)據(jù)庫(kù)的相關(guān)資料,JDBC是一種用于執(zhí)行SQL語(yǔ)句的Java?API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn),需要的朋友可以參考下
    2023-12-12
  • IDEA性能優(yōu)化設(shè)置(解決卡頓問(wèn)題)

    IDEA性能優(yōu)化設(shè)置(解決卡頓問(wèn)題)

    在我們?nèi)粘J褂肐DEA進(jìn)行開(kāi)發(fā)時(shí),可能會(huì)遇到許多卡頓的瞬間,本文主要介紹了IDEA性能優(yōu)化設(shè)置,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2023-05-05
  • java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    在項(xiàng)目開(kāi)發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺(tái)并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案

    Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案

    這篇文章主要介紹了Java中生成微信小程序太陽(yáng)碼的實(shí)現(xiàn)方案,本文講解了如何生成微信小程序太陽(yáng)碼,通過(guò)微信提供的兩種方案都可以實(shí)現(xiàn),在實(shí)際的項(xiàng)目中建議采用第二種方案,需要的朋友可以參考下
    2022-05-05
  • Mybatis中單雙引號(hào)引發(fā)的慘案及解決

    Mybatis中單雙引號(hào)引發(fā)的慘案及解決

    這篇文章主要介紹了Mybatis中單雙引號(hào)引發(fā)的慘案及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

博乐市| 宝鸡市| 赤壁市| 巴马| 连云港市| 高碑店市| 揭阳市| 揭阳市| 深泽县| 梧州市| 文成县| 鄯善县| 许昌市| 芷江| 巴东县| 泸水县| 蒙阴县| 丁青县| 南京市| 庆城县| 汶上县| 息烽县| 蓬溪县| 兴仁县| 禄丰县| 盘山县| 米脂县| 奈曼旗| 西昌市| 漠河县| 汉中市| 温宿县| 德江县| 阜宁县| 澎湖县| 楚雄市| 和平县| 扬州市| 曲阜市| 体育| 汝南县|