1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        設(shè)計(jì)模式-創(chuàng)建型-go實(shí)現(xiàn)版

        共 8987字,需瀏覽 18分鐘

         ·

        2023-03-03 18:55

        介紹

        在軟件開發(fā)中,創(chuàng)建型設(shè)計(jì)模式(Creational Design Pattern)是一組用于對(duì)象創(chuàng)建的設(shè)計(jì)模式。它們的共同目標(biāo)是封裝對(duì)象的創(chuàng)建過程,從而提高代碼的復(fù)用性和靈活性。根據(jù)經(jīng)典的GOF設(shè)計(jì)模式,創(chuàng)建型模式主要包括以下5種:
        1. 工廠方法模式(Factory Method Pattern):定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪個(gè)類。工廠方法模式讓一個(gè)類的實(shí)例化延遲到其子類中進(jìn)行。

        2. 抽象工廠模式(Abstract Factory Pattern):提供一個(gè)接口,用于創(chuàng)建相關(guān)或依賴對(duì)象的家族,而不需要明確指定具體類。

        3. 單例模式(Singleton Pattern):確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)。

        4. 建造者模式(Builder Pattern):將一個(gè)復(fù)雜對(duì)象的構(gòu)建過程與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

        5. 原型模式(Prototype Pattern):使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過復(fù)制這些原型來創(chuàng)建新的對(duì)象。

        除了這五種經(jīng)典的創(chuàng)建型設(shè)計(jì)模式,還有一些變體或衍生的創(chuàng)建型模式,例如簡(jiǎn)單工廠模式、多例模式等。每種創(chuàng)建型模式都有其特定的適用場(chǎng)景和優(yōu)缺點(diǎn),開發(fā)者需要根據(jù)實(shí)際情況選擇最適合自己項(xiàng)目需求的模式。

        使用場(chǎng)景

        創(chuàng)建型設(shè)計(jì)模式是用于創(chuàng)建對(duì)象的一種模式。常見的創(chuàng)建型設(shè)計(jì)模式有以下幾種:
        1. 工廠方法模式:定義一個(gè)用于創(chuàng)建對(duì)象的接口,但由子類決定要實(shí)例化的類是哪一個(gè),適用于需要?jiǎng)討B(tài)地創(chuàng)建對(duì)象的場(chǎng)景。

        2. 抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類,適用于需要?jiǎng)?chuàng)建一系列相關(guān)對(duì)象的場(chǎng)景。

        3. 單例模式:確保一個(gè)類只有一個(gè)實(shí)例,并提供全局訪問點(diǎn),適用于需要確保只有一個(gè)實(shí)例存在的場(chǎng)景。

        4. 原型模式:通過復(fù)制已有對(duì)象來創(chuàng)建新對(duì)象,而無需知道任何創(chuàng)建的細(xì)節(jié),適用于需要快速創(chuàng)建新對(duì)象的場(chǎng)景。

        5. 建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示,適用于需要?jiǎng)?chuàng)建復(fù)雜對(duì)象的場(chǎng)景。

        在選擇創(chuàng)建型設(shè)計(jì)模式時(shí),需要考慮以下幾個(gè)方面:
        1. 系統(tǒng)的復(fù)雜性:如果系統(tǒng)非常復(fù)雜,那么可能需要使用創(chuàng)建型設(shè)計(jì)模式來幫助管理對(duì)象的創(chuàng)建和組織。

        2. 對(duì)象的數(shù)量:如果需要?jiǎng)?chuàng)建大量的對(duì)象,那么可以考慮使用創(chuàng)建型設(shè)計(jì)模式來減少對(duì)象的創(chuàng)建和銷毀次數(shù)。

        3. 對(duì)象的依賴關(guān)系:如果對(duì)象之間存在復(fù)雜的依賴關(guān)系,那么可以考慮使用創(chuàng)建型設(shè)計(jì)模式來處理這些依賴關(guān)系。

        4. 系統(tǒng)的擴(kuò)展性:選擇合適的創(chuàng)建型設(shè)計(jì)模式可以使系統(tǒng)更易于擴(kuò)展和維護(hù)。

        總之,在選擇創(chuàng)建型設(shè)計(jì)模式時(shí),需要結(jié)合自己的經(jīng)驗(yàn)和技能,綜合考慮各種因素,以選擇最適合自己的設(shè)計(jì)模式。同時(shí),還需要注意不要過度使用設(shè)計(jì)模式,以免代碼過于復(fù)雜。

        實(shí)現(xiàn)例子

        工廠方法模式

        工廠方法模式是一種常用的創(chuàng)建型設(shè)計(jì)模式,它的核心思想是將對(duì)象的創(chuàng)建過程封裝起來,使得對(duì)象的創(chuàng)建和使用相分離。在 Go 語言中,可以通過接口和結(jié)構(gòu)體實(shí)現(xiàn)工廠方法模式。
        package main

        import "fmt"

        // 定義接口
        type Product interface {
            GetName() string
        }

        // 定義結(jié)構(gòu)體A
        type ProductA struct{
         AxxProti AAA
        }

        func (p *ProductA) GetName() string {
            return "ProductA"
        }

        // 定義結(jié)構(gòu)體B
        type ProductB struct{}

        func (p *ProductB) GetName() string {
            return "ProductB"
        }

        // 定義工廠接口
        type Factory interface {
            Create() Product
        }

        // 定義工廠A
        type FactoryA struct{}

        func (f *FactoryA) Create() Product {
            return &ProductA{}
        }

        // 定義工廠B
        type FactoryB struct{}

        func (f *FactoryB) Create() Product {
            return &ProductB{}
        }

        func main() {
            // 創(chuàng)建工廠A
            factoryA := &FactoryA{}
            // 通過工廠A創(chuàng)建產(chǎn)品A
            productA := factoryA.Create()
            fmt.Println(productA.GetName()) // 輸出:ProductA

            // 創(chuàng)建工廠B
            factoryB := &FactoryB{}
            // 通過工廠B創(chuàng)建產(chǎn)品B
            productB := factoryB.Create()
            fmt.Println(productB.GetName()) // 輸出:ProductB
        }
        在這個(gè)示例中,Product 接口定義了產(chǎn)品的方法,ProductAProductB 結(jié)構(gòu)體分別實(shí)現(xiàn)了 Product 接口。Factory 接口定義了工廠的方法,FactoryAFactoryB 結(jié)構(gòu)體分別實(shí)現(xiàn)了 Factory 接口,其中 FactoryA 可以用于創(chuàng)建 ProductAFactoryB 可以用于創(chuàng)建 ProductB。
        main 函數(shù)中,我們創(chuàng)建了 FactoryAFactoryB 兩個(gè)工廠,然后通過它們分別創(chuàng)建了 ProductAProductB 兩個(gè)產(chǎn)品。由于每個(gè)工廠只能創(chuàng)建對(duì)應(yīng)的產(chǎn)品,因此輸出的結(jié)果也不同。

        抽象工廠模式

        抽象工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一個(gè)創(chuàng)建一系列相關(guān)或依賴對(duì)象的接口,而無需指定具體類。在 Go 語言中,可以通過接口和結(jié)構(gòu)體實(shí)現(xiàn)抽象工廠模式。
        package main

        import "fmt"

        // 定義接口1
        type Button interface {
            Paint()
        }

        // 定義接口2
        type Label interface {
            Paint()
        }

        // 定義工廠接口
        type GUIFactory interface {
            CreateButton() Button
            CreateLabel() Label
        }

        // 定義具體按鈕結(jié)構(gòu)體
        type WindowsButton struct{}

        func (b *WindowsButton) Paint() {
            fmt.Println("Windows Button")
        }

        type MacButton struct{}

        func (b *MacButton) Paint() {
            fmt.Println("Mac Button")
        }

        // 定義具體標(biāo)簽結(jié)構(gòu)體
        type WindowsLabel struct{}

        func (l *WindowsLabel) Paint() {
            fmt.Println("Windows Label")
        }

        type MacLabel struct{}

        func (l *MacLabel) Paint() {
            fmt.Println("Mac Label")
        }

        // 定義具體工廠
        type WindowsGUIFactory struct{}

        func (f *WindowsGUIFactory) CreateButton() Button {
            return &WindowsButton{}
        }

        func (f *WindowsGUIFactory) CreateLabel() Label {
            return &WindowsLabel{}
        }

        type MacGUIFactory struct{}

        func (f *MacGUIFactory) CreateButton() Button {
            return &MacButton{}
        }

        func (f *MacGUIFactory) CreateLabel() Label {
            return &MacLabel{}
        }

        func main() {
            // 創(chuàng)建Windows GUI工廠
            windowsFactory := &WindowsGUIFactory{}
            windowsButton := windowsFactory.CreateButton()
            windowsLabel := windowsFactory.CreateLabel()

            windowsButton.Paint() // 輸出:Windows Button
            windowsLabel.Paint()  // 輸出:Windows Label

            // 創(chuàng)建Mac GUI工廠
            macFactory := &MacGUIFactory{}
            macButton := macFactory.CreateButton()
            macLabel := macFactory.CreateLabel()

            macButton.Paint() // 輸出:Mac Button
            macLabel.Paint()  // 輸出:Mac Label
        }

        單例模式

        在 Go 語言中,可以通過 sync 包的 Once 類型實(shí)現(xiàn)單例模式。Once 類型可以保證其內(nèi)部的函數(shù)只會(huì)執(zhí)行一次,因此我們可以利用它來實(shí)現(xiàn)單例模式。
        package singleton

        import "sync"

        type singleton struct{}

        var instance *singleton
        var once sync.Once

        func GetInstance() *singleton {
            once.Do(func() {
                instance = &singleton{}
            })
            return instance
        }
        在上面的代碼中,我們首先定義了一個(gè)名為 singleton 的結(jié)構(gòu)體類型,用來表示單例對(duì)象。然后定義了一個(gè)全局變量 instance,用來存儲(chǔ)單例對(duì)象的實(shí)例。同時(shí),我們還定義了一個(gè) sync.Once 類型的全局變量 once,用來保證 GetInstance 函數(shù)只會(huì)執(zhí)行一次。
        GetInstance 函數(shù)會(huì)首先判斷 instance 是否已經(jīng)被初始化。如果已經(jīng)被初始化,直接返回 instance;否則,執(zhí)行 once.Do 函數(shù)來初始化 instance,并返回 instance。
        使用 sync.Once 實(shí)現(xiàn)單例模式的好處在于它可以保證線程安全,并且只會(huì)在第一次使用時(shí)才會(huì)初始化單例對(duì)象。這樣可以避免在程序啟動(dòng)時(shí)就初始化單例對(duì)象,從而提高程序啟動(dòng)速度。

        建造者模式

        在 Go 語言中,可以通過建造者模式來創(chuàng)建復(fù)雜的對(duì)象。建造者模式將對(duì)象的創(chuàng)建過程分解為多個(gè)簡(jiǎn)單的步驟,從而使得不同的創(chuàng)建過程可以組合在一起,生成不同的對(duì)象。
        package builder

        type Builder interface {
            SetName(name string) Builder
            SetAge(age int) Builder
            Build() *Person
        }

        type Person struct {
            Name string
            Age  int
        }

        type PersonBuilder struct {
            person *Person
        }

        func NewPersonBuilder() *PersonBuilder {
            return &PersonBuilder{person: &Person{}}
        }

        func (b *PersonBuilder) SetName(name string) Builder {
            b.person.Name = name
            return b
        }

        func (b *PersonBuilder) SetAge(age int) Builder {
            b.person.Age = age
             return b
        }

        func (b *PersonBuilder) Build() *Person {
            return b.person
        }

        在上面的代碼中,我們定義了一個(gè) Builder 接口,用來描述建造者模式的創(chuàng)建過程。Builder 接口中包含了多個(gè)簡(jiǎn)單的方法,用來設(shè)置不同的屬性。同時(shí),我們還定義了一個(gè) Person 結(jié)構(gòu)體,用來表示最終生成的對(duì)象。
        PersonBuilder 結(jié)構(gòu)體實(shí)現(xiàn)了 Builder 接口,并包含了一個(gè)指向 Person 結(jié)構(gòu)體的指針。在 SetName 和 SetAge 方法中,我們?cè)O(shè)置了 Person 結(jié)構(gòu)體的 Name 和 Age 屬性,并返回了 PersonBuilder 的指針,用于鏈?zhǔn)秸{(diào)用。在 Build 方法中,我們返回了 Person 結(jié)構(gòu)體的指針,表示創(chuàng)建過程結(jié)束。
        使用建造者模式可以將復(fù)雜對(duì)象的創(chuàng)建過程分解為多個(gè)簡(jiǎn)單的步驟,從而使得創(chuàng)建過程更加靈活和可擴(kuò)展。在上面的示例中,我們只需要在 PersonBuilder 結(jié)構(gòu)體中添加更多的方法來設(shè)置其他屬性,就可以創(chuàng)建不同的 Person 對(duì)象。

        原型模式

        原型模式是一種創(chuàng)建型設(shè)計(jì)模式,其主要思想是通過克隆現(xiàn)有對(duì)象來創(chuàng)建新的對(duì)象,從而避免使用昂貴的構(gòu)造函數(shù)。在 Go 語言中,可以通過接口和結(jié)構(gòu)體來實(shí)現(xiàn)原型模式。
        package prototype

        import (
            "fmt"
        )

        type Prototype interface {
            Clone() Prototype
            GetName() string
        }

        type ConcretePrototype struct {
            name string
        }

        func (p *ConcretePrototype) Clone() Prototype {
            return &ConcretePrototype{name: p.name}
        }

        func (p *ConcretePrototype) GetName() string {
            return p.name
        }

        func main() {
            prototype := &ConcretePrototype{name: "prototype"}
            clone := prototype.Clone()
            fmt.Println(clone.GetName())
        }

        在上面的代碼中,我們定義了一個(gè) Prototype 接口,其中包含了 Clone 和 GetName 兩個(gè)方法。Clone 方法用于克隆對(duì)象,GetName 方法用于獲取對(duì)象的名稱。同時(shí),我們還定義了一個(gè) ConcretePrototype 結(jié)構(gòu)體,用于表示具體的原型對(duì)象。在 Clone 方法中,我們通過創(chuàng)建一個(gè)新的 ConcretePrototype 對(duì)象來克隆原型對(duì)象。在 GetName 方法中,我們返回了原型對(duì)象的名稱。
        在 main 函數(shù)中,我們首先創(chuàng)建了一個(gè) ConcretePrototype 對(duì)象,然后通過調(diào)用 Clone 方法來克隆該對(duì)象。最后,我們打印了克隆對(duì)象的名稱,證明克隆操作成功。
        使用原型模式可以避免使用昂貴的構(gòu)造函數(shù),從而提高對(duì)象創(chuàng)建的效率。另外,原型模式還可以用來動(dòng)態(tài)生成對(duì)象,具有很好的擴(kuò)展性。



        瀏覽 22
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            97精品伊人久久久大香线蕉97 | 欧美日bb| 久久精品国产精品青草最新版截图 | 制服丝袜办公室ol中出视频 | 国产农村妇女伦理 | 激情变态少妇视频 | 韩国一级片在线观看 | 1000部毛片A片免费视频 免费无码精品久久久嫩青 又大又粗又爽的视频 | 强壮公侵犯使我夜夜高潮 | 亚洲男人的天堂网 |