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

深入理解Java設(shè)計模式之建造者模式

 更新時間:2021年11月07日 14:58:28   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計模式之建造者模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供X大家參考和學(xué)習(xí),感興趣的朋友可以了解下

一、什么是建造者模式

建造者模式也稱生成器模式 定義:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示(依賴倒轉(zhuǎn))

產(chǎn)品類:一般是一個較為復(fù)雜的對象,也就是說創(chuàng)建對象的過程比較復(fù)雜,一般會有比較多的代碼量。在本類圖中,產(chǎn)品類是一個具體的類,而非抽象類。實際編程中,產(chǎn)品類可以是由一個抽象類與它的不同實現(xiàn)組成,也可以是由多個抽象類與他們的實現(xiàn)組成。

抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現(xiàn)。這樣更容易擴展。一般至少會有兩個抽象方法,一個用來建造產(chǎn)品,一個是用來返回產(chǎn)品。

建造者:實現(xiàn)抽象類的所有未實現(xiàn)的方法,具體來說一般是兩項任務(wù):組建產(chǎn)品;返回組建好的產(chǎn)品。

指揮類:負(fù)責(zé)調(diào)用適當(dāng)?shù)慕ㄔ煺邅斫M建產(chǎn)品,指揮類一般不與產(chǎn)品類發(fā)生依賴關(guān)系,與指揮類直接交互的是建造者類。一般來說,指揮類被用來封裝程序中易變的部分。

二、建造者模式的應(yīng)用場景

1.創(chuàng)建復(fù)雜對象的算法獨立于組成對象的部件

2.同一個創(chuàng)建過程需要有不同的內(nèi)部表象的產(chǎn)品對象

例子:建房子,不管建什么房子,它們都離不開地基、柱子、層面和墻體這些組成部分,建筑工人就是把這些組成部分一個個建起來,最后連成一體建出一棟棟樓房。

三、建造者模式的優(yōu)缺點

優(yōu)點

1.客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。

2.每一個具體建造者都獨立,因此可以方便地替換具體建造者或增加新的具體建造者, 用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象 。

3.可以更加精細(xì)地控制產(chǎn)品的創(chuàng)建過程 。將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便使用程序來控制創(chuàng)建過程。

4.增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統(tǒng)擴展方便,符合“開閉”。

缺點

1.當(dāng)建造者過多時,會產(chǎn)生很多類,難以維護。

2.建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似,若產(chǎn)品之間的差異性很大,則不適合使用該模式,因此其使用范圍受到一定限制。

3.若產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。

四、工廠模式和建造者模式的對比

工廠模式用于處理 如何獲取實例對象 問題,建造者模式用于處理如何建造實例對象 問題

建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅只比工廠模式多了一個“指揮類”的角色。在建造者模式的類圖中,假如把這個指揮類看做是最終調(diào)用的客戶端,那么剩余的部分就可以看作是一個簡單的工廠模式了。

與工廠模式相比,建造者模式一般用來創(chuàng)建更為復(fù)雜的對象,因為對象的創(chuàng)建過程更為復(fù)雜,因此將對象的創(chuàng)建過程獨立出來組成一個新的類——指揮類。

也就是說,工廠模式是將對象的全部創(chuàng)建過程封裝在工廠類中,由工廠類向客戶端提供最終的產(chǎn)品;而建造者模式中,建造者類一般只提供產(chǎn)品類中各個組件的建造,而將具體建造過程交付給指揮類。由指揮類負(fù)責(zé)將各個組件按照特定的規(guī)則組建為產(chǎn)品,然后將組建好的產(chǎn)品交付給客戶端。

五、建造者模式的實現(xiàn)

Product類---產(chǎn)品類,由多個部件組成

//Product類,由多個部件組成
public class Product
{
    List<string> parts = new List<string>();
    //添加產(chǎn)品部件
    public void Add(string part)
    {
        parts.Add(part);
    }
     public void show()
    {
        Console.WriteLine("\n  創(chuàng)建產(chǎn)品");
        foreach (var item in parts)
        {
            Console.WriteLine("item");
        }
    }
}

Builder類---抽象建造者類,確定產(chǎn)品由兩個部件PartA和PartB組成,并聲明一個得到產(chǎn)品建造后結(jié)果的方法GetResult

abstract class Builder
{
    public abstract void BuilderPartA();
    public abstract void BuilderPartB();
    public abstract Product GetResult();
}

具體建造者類

//ConcreteBuilder1類---具體建造者類
class ConcreteBuilder1 : Builder
{
    private Product product = new Product();
    //建造具體的兩個部件
    public override void BuilderPartA()
    {
        product.Add("部件A");
    }
     public override void BuilderPartB()
    {
        product.Add("部件B");
    }
     public override Product GetResult()
    {
        return product;
    }
}
//ConcreteBuilder2類---具體建造者類
class ConcreteBuilder2 : Builder
{
    private Product product = new Product();
    //建造具體的兩個部件
    public override void BuilderPartA()
    {
        product.Add("部件X");
    }
     public override void BuilderPartB()
    {
        product.Add("部件Y");
    }
     public override Product GetResult()
    {
        return product;
    }
}

Director類---指揮者類

class Director
{
    public void Construct(Builder builder)
    {
        //用來指揮建造過程
        builder.BuilderPartA();
        builder.BuilderPartB();
    }
}

客戶端代碼---客戶不需知道具體的建造過程

static void Main(string[] args)
{
    Director director = new Director();
    Builder b1 = new ConcreteBuilder1();
    Builder b2 = new ConcreteBuilder2();
     //指揮者用ConcreteBuilder1方法建造產(chǎn)品
    director.Construct(b1);
    Product p1 = b1.GetResult();
    p1.show();
     //指揮者用ConcreteBuilder2方法建造產(chǎn)品
    director.Construct(b2);
    Product p2 = b2.GetResult();
    p2.show();
     Console.Read();
}

六、總結(jié)

建造者模式的使用場合是當(dāng)創(chuàng)建復(fù)雜對象時,把創(chuàng)建對象成員和裝配方法分離出來,放在建造者類中去實現(xiàn),用戶使用該復(fù)雜對象時,不用理會它的創(chuàng)建和裝配過程,只關(guān)心它的表示形式。

其實完全理解這個模式還是要一番思考的,難以搞懂的是指揮者似乎沒什么存在的必要,在代碼里也沒體現(xiàn)它的作用,我們也可以把指揮者的方法放在建造者里面,但為什么沒有這樣做呢?我想這可能是考慮到單一責(zé)任原則,建造者只負(fù)責(zé)創(chuàng)建對象的各個部分,至于各個部分創(chuàng)建的順序、裝配方法它就不管了。還有就是當(dāng)順序要改變時,建造者可以不用改動,改動指揮者就好了,指揮者只有一個,建造者有很多,要改建造者就麻煩了。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • quartz時間表達(dá)式Cron詳解

    quartz時間表達(dá)式Cron詳解

    這篇文章介紹了quartz時間表達(dá)式Cron,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot集成RabbitMQ的方法(死信隊列)

    SpringBoot集成RabbitMQ的方法(死信隊列)

    這篇文章主要介紹了SpringBoot集成RabbitMQ的方法(死信隊列),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 詳解MyBatisPlus如何實現(xiàn)分頁和查詢操作

    詳解MyBatisPlus如何實現(xiàn)分頁和查詢操作

    這篇文章主要為大家詳細(xì)介紹了MyBatisPlus是如何實現(xiàn)分頁和查詢操作的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • 詳解MybatisPlus3.4版本之后分頁插件的使用

    詳解MybatisPlus3.4版本之后分頁插件的使用

    從Mybatis Plus 3.4.0版本開始,不再使用舊版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。本文就詳細(xì)的介紹一下兩者的區(qū)別,感興趣的可以了解一下
    2021-11-11
  • Java類中static{}的具體使用

    Java類中static{}的具體使用

    static{}(即static塊),會在類被加載的時候執(zhí)行且僅會被執(zhí)行一次,一般用來初始化靜態(tài)變量和調(diào)用靜態(tài)方法,本文主要介紹了Java類中static{}的具體使用,感興趣的可以了解一下
    2024-07-07
  • Java文件大小轉(zhuǎn)換的兩種方式小結(jié)

    Java文件大小轉(zhuǎn)換的兩種方式小結(jié)

    在程序開發(fā)的過程中,文件的大小在視圖呈現(xiàn)和數(shù)據(jù)庫存儲的過程不一致怎么轉(zhuǎn)換呢,本文主要介紹了Java文件大小轉(zhuǎn)換的兩種方式小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • J2SE基礎(chǔ)之下載eclipse并創(chuàng)建項目

    J2SE基礎(chǔ)之下載eclipse并創(chuàng)建項目

    本文給大家介紹的是最流行的java 集成開發(fā)環(huán)境IDE eclipse的使用方法,非常的簡單,有需要的小伙伴可以參考下
    2016-05-05
  • 使用@ConfigurationProperties實現(xiàn)類型安全的配置過程

    使用@ConfigurationProperties實現(xiàn)類型安全的配置過程

    這篇文章主要介紹了使用@ConfigurationProperties實現(xiàn)類型安全的配置過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring?Boot集成etcd的詳細(xì)過程

    Spring?Boot集成etcd的詳細(xì)過程

    etcd是一個分布式鍵值存儲數(shù)據(jù)庫,用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺支持,很小的二進制文件和強大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • Mybatis返回值(resultType&resultMap)的具體使用

    Mybatis返回值(resultType&resultMap)的具體使用

    返回值屬性有兩種設(shè)置,一種是resultType,一種是resultMap,本文主要介紹了Mybatis返回值(resultType&resultMap)的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08

最新評論

孝义市| 桐梓县| 凤城市| 高淳县| 内黄县| 大姚县| 衡东县| 库车县| 通山县| 广宁县| 石楼县| 徐汇区| 信丰县| 溧水县| 深泽县| 乡宁县| 北京市| 军事| 西青区| 藁城市| 上林县| 宿松县| 龙岩市| 临夏县| 香格里拉县| 山西省| 大连市| 同仁县| 正蓝旗| 什邡市| 临潭县| 天镇县| 陈巴尔虎旗| 合阳县| 扎囊县| 公安县| 柞水县| 桐柏县| 元氏县| 济源市| 甘洛县|