成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java設(shè)計(jì)模式之builder模式

lindroid / 956人閱讀

摘要:代碼實(shí)例我們通常構(gòu)造一個(gè)有很多參數(shù)的對象時(shí)有三種方式構(gòu)造器重載,模式和模式。很明顯這種構(gòu)造器重載的方式對于多屬性的情況是不完美的。方式方式就是提供方法,在使用的時(shí)候根據(jù)需求先調(diào)用無參構(gòu)造器再調(diào)用方法填充屬性值。

Java設(shè)計(jì)模式之builder模式

今天學(xué)mybatis的時(shí)候,知道了SQLSessionFactory使用的是builder模式來生成的。再次整理一下什么是builder模式以及應(yīng)用場景。

1. builder簡介

builder模式也叫建造者模式,builder模式的作用將一個(gè)復(fù)雜對象的構(gòu)建與他的表示分離,使用者可以一步一步的構(gòu)建一個(gè)比較復(fù)雜的對象。

2. 代碼實(shí)例

我們通常構(gòu)造一個(gè)有很多參數(shù)的對象時(shí)有三種方式:構(gòu)造器重載,JavaBeans模式和builder模式。通過一個(gè)小例子我們來看一下builder模式的優(yōu)勢。

2.1 構(gòu)造器重載方式
package com.wangjun.designPattern.builder;

public class Product {
    
    private int id;
    private String name;
    private int type;
    private float price;
    
    public Product() {
        super();
    }
    
    public Product(int id) {
        super();
        this.id = id;
    }

    public Product(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public Product(int id, String name, int type) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
    }

    public Product(int id, String name, int type, float price) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
        this.price = price;
    }

}

使用構(gòu)造器重載我們需要定義很多構(gòu)造器,為了應(yīng)對使用者不同的需求(有些可能只需要id,有些需要id和name,有些只需要name,......),理論上我們需要定義2^4 = 16個(gè)構(gòu)造器,這只是4個(gè)參數(shù),如果參數(shù)更多的話,那將是指數(shù)級增長,肯定是不合理的。要么你定義一個(gè)全部參數(shù)的構(gòu)造器,使用者只能多傳入一些不需要的屬性值來匹配你的構(gòu)造器。很明顯這種構(gòu)造器重載的方式對于多屬性的情況是不完美的。

2.2 JavaBeans方式
package com.wangjun.designPattern.builder;

public class Product2 {
    
    private int id;
    private String name;
    private int type;
    private float price;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }

}

JavaBeans方式就是提供setter方法,在使用的時(shí)候根據(jù)需求先調(diào)用無參構(gòu)造器再調(diào)用setter方法填充屬性值。

Product2 p2 = new Product2();
p2.setId(10);
p2.setName("phone");
p2.setPrice(100);
p2.setType(1);

這種方式彌補(bǔ)了構(gòu)造器重載的不足,創(chuàng)建實(shí)例很容易,代碼讀起來也很容易。但是,因?yàn)闃?gòu)造過程被分到了幾個(gè)調(diào)用中,在構(gòu)造過程中JavaBeans可能處于不一致的狀態(tài),類無法僅僅通過檢驗(yàn)構(gòu)造器參數(shù)的有效性來保證一致性。

2.3 builder模式
package com.wangjun.designPattern.builder;

public class Product3 {
    
    private final int id;
    private final String name;
    private final int type;
    private final float price;
    
    private Product3(Builder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.type = builder.type;
        this.price = builder.price;
    }
    
    public static class Builder {
        private int id;
        private String name;
        private int type;
        private float price;
        
        public Builder id(int id) {
            this.id = id;
            return this;
        }
        public Builder name(String name) {
            this.name = name;
            return this;
        }
        public Builder type(int type) {
            this.type = type;
            return this;
        }
        public Builder price(float price) {
            this.price = price;
            return this;
        }
        
        public Product3 build() {
            return new Product3(this);
        }
    }

}

可以看到builder模式將屬性定義為不可變的,然后定義一個(gè)內(nèi)部靜態(tài)類Builder來構(gòu)建屬性,再通過一個(gè)只有Builder參數(shù)的構(gòu)造器來生成Product對象。Builder的setter方法返回builder本身,以便可以將屬性連接起來。我們就可以像下面這樣使用了。

Product3 p3 = new Product3.Builder()
                            .id(10)
                            .name("phone")
                            .price(100)
                            .type(1)
                            .build();

當(dāng)然具體使用builder的情況肯定沒有這么簡單,但是思路大致一樣:先通過某種方式取得構(gòu)造對象需要的所有參數(shù),再通過這些參數(shù)一次性構(gòu)建這個(gè)對象。比如MyBatis中SqlSessionFactoryBuilder就是通過讀取MyBatis的xml配置文件來獲取構(gòu)造SqlSessionFactory所需要的參數(shù)的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77256.html

相關(guān)文章

  • 一天一個(gè)設(shè)計(jì)模式JS實(shí)現(xiàn)——建造者模式

    摘要:參考文章設(shè)計(jì)模式之建造者模式一什么是建造者模式建造者模式是將一個(gè)復(fù)雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 參考文章:java設(shè)計(jì)模式之建造者模式 一、什么是建造者模式建造者模式:是將一個(gè)復(fù)雜的對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。工廠類模式提供的是創(chuàng)建單個(gè)類的模式,而建造者模式則是將各種產(chǎn)品集中起來進(jìn)行管理,用來創(chuàng)建復(fù)合對象,所謂...

    boredream 評論0 收藏0
  • 《源碼中的設(shè)計(jì)模式建造者模式——鏈?zhǔn)秸{(diào)用

    摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設(shè)計(jì)模式。為我們提供了建造者模式的快速實(shí)現(xiàn),要應(yīng)用到實(shí)際編碼中。 ...

    wind3110991 評論0 收藏0
  • Java設(shè)計(jì)模式-建造者模式

    摘要:在建造者模式比較龐大時(shí),導(dǎo)演類可以有多個(gè)。該種場景只能是一個(gè)補(bǔ)償方法,因?yàn)橐粋€(gè)對象不容易獲得,而在設(shè)計(jì)階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設(shè)計(jì)的最初目標(biāo)。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 Separate the construction of a complex object from its representation so that the same...

    txgcwm 評論0 收藏0
  • 設(shè)計(jì)模式建造者模式

    摘要:建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來說一般是兩項(xiàng)任務(wù)組建產(chǎn)品返回組建好的產(chǎn)品。 0x01.定義與類型 定義:將一個(gè)復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 用戶只需指定需要建造的類型就可以得到他們,建造過程及細(xì)節(jié)不需要知道 類型:創(chuàng)建型 實(shí)現(xiàn)建造模式的兩種方式 1.抽象建造者 UML: showImg(https://segmentfault.co...

    banana_pi 評論0 收藏0
  • 深入理解建造者模式 ——組裝復(fù)雜的實(shí)例

    摘要:而建造者模式則是要求按照指定的藍(lán)圖建造產(chǎn)品,它的主要目的是通過組裝零配件而產(chǎn)生一個(gè)新產(chǎn)品。最后通過一個(gè)套餐實(shí)例,介紹了建造者模式在實(shí)例中的基本使用手段。 歷史文章回顧: 設(shè)計(jì)模式專欄 深入理解單例模式 深入理解工廠模式 歷史優(yōu)質(zhì)文章推薦: 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論 可能是最漂亮的Spring事務(wù)管理詳解 面試中關(guān)于Java虛擬機(jī)(jvm)的問題看這篇就夠了 無論是在現(xiàn)實(shí)世界中還是在軟件...

    sanyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<