<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          設(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)建過(guò)程,從而提高代碼的復(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è)全局訪問(wèn)點(diǎn)。

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

          5. 原型模式(Prototype Pattern):使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并通過(guò)復(fù)制這些原型來(lái)創(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ì)象的接口,而無(wú)需指定它們具體的類,適用于需要?jiǎng)?chuàng)建一系列相關(guān)對(duì)象的場(chǎng)景。

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

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

          5. 建造者模式:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(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ì)模式來(lái)幫助管理對(duì)象的創(chuàng)建和組織。

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

          3. 對(duì)象的依賴關(guān)系:如果對(duì)象之間存在復(fù)雜的依賴關(guān)系,那么可以考慮使用創(chuàng)建型設(shè)計(jì)模式來(lái)處理這些依賴關(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í),還需要注意不要過(guò)度使用設(shè)計(jì)模式,以免代碼過(guò)于復(fù)雜。

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

          工廠方法模式

          工廠方法模式是一種常用的創(chuàng)建型設(shè)計(jì)模式,它的核心思想是將對(duì)象的創(chuàng)建過(guò)程封裝起來(lái),使得對(duì)象的創(chuàng)建和使用相分離。在 Go 語(yǔ)言中,可以通過(guò)接口和結(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{}
              // 通過(guò)工廠A創(chuàng)建產(chǎn)品A
              productA := factoryA.Create()
              fmt.Println(productA.GetName()) // 輸出:ProductA

              // 創(chuàng)建工廠B
              factoryB := &FactoryB{}
              // 通過(guò)工廠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è)工廠,然后通過(guò)它們分別創(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ì)象的接口,而無(wú)需指定具體類。在 Go 語(yǔ)言中,可以通過(guò)接口和結(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 語(yǔ)言中,可以通過(guò) sync 包的 Once 類型實(shí)現(xiàn)單例模式。Once 類型可以保證其內(nèi)部的函數(shù)只會(huì)執(zhí)行一次,因此我們可以利用它來(lái)實(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)體類型,用來(lái)表示單例對(duì)象。然后定義了一個(gè)全局變量 instance,用來(lái)存儲(chǔ)單例對(duì)象的實(shí)例。同時(shí),我們還定義了一個(gè) sync.Once 類型的全局變量 once,用來(lái)保證 GetInstance 函數(shù)只會(huì)執(zhí)行一次。
          GetInstance 函數(shù)會(huì)首先判斷 instance 是否已經(jīng)被初始化。如果已經(jīng)被初始化,直接返回 instance;否則,執(zhí)行 once.Do 函數(shù)來(lái)初始化 instance,并返回 instance。
          使用 sync.Once 實(shí)現(xiàn)單例模式的好處在于它可以保證線程安全,并且只會(huì)在第一次使用時(shí)才會(huì)初始化單例對(duì)象。這樣可以避免在程序啟動(dòng)時(shí)就初始化單例對(duì)象,從而提高程序啟動(dòng)速度。

          建造者模式

          在 Go 語(yǔ)言中,可以通過(guò)建造者模式來(lái)創(chuàng)建復(fù)雜的對(duì)象。建造者模式將對(duì)象的創(chuàng)建過(guò)程分解為多個(gè)簡(jiǎn)單的步驟,從而使得不同的創(chuàng)建過(guò)程可以組合在一起,生成不同的對(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 接口,用來(lái)描述建造者模式的創(chuàng)建過(guò)程。Builder 接口中包含了多個(gè)簡(jiǎn)單的方法,用來(lái)設(shè)置不同的屬性。同時(shí),我們還定義了一個(gè) Person 結(jié)構(gòu)體,用來(lái)表示最終生成的對(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)建過(guò)程結(jié)束。
          使用建造者模式可以將復(fù)雜對(duì)象的創(chuàng)建過(guò)程分解為多個(gè)簡(jiǎn)單的步驟,從而使得創(chuàng)建過(guò)程更加靈活和可擴(kuò)展。在上面的示例中,我們只需要在 PersonBuilder 結(jié)構(gòu)體中添加更多的方法來(lái)設(shè)置其他屬性,就可以創(chuàng)建不同的 Person 對(duì)象。

          原型模式

          原型模式是一種創(chuàng)建型設(shè)計(jì)模式,其主要思想是通過(guò)克隆現(xiàn)有對(duì)象來(lái)創(chuàng)建新的對(duì)象,從而避免使用昂貴的構(gòu)造函數(shù)。在 Go 語(yǔ)言中,可以通過(guò)接口和結(jié)構(gòu)體來(lái)實(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 方法中,我們通過(guò)創(chuàng)建一個(gè)新的 ConcretePrototype 對(duì)象來(lái)克隆原型對(duì)象。在 GetName 方法中,我們返回了原型對(duì)象的名稱。
          在 main 函數(shù)中,我們首先創(chuàng)建了一個(gè) ConcretePrototype 對(duì)象,然后通過(guò)調(diào)用 Clone 方法來(lái)克隆該對(duì)象。最后,我們打印了克隆對(duì)象的名稱,證明克隆操作成功。
          使用原型模式可以避免使用昂貴的構(gòu)造函數(shù),從而提高對(duì)象創(chuàng)建的效率。另外,原型模式還可以用來(lái)動(dòng)態(tài)生成對(duì)象,具有很好的擴(kuò)展性。



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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷五月天色色 | 色77777| 日韩无码免费播放 | 自拍三级片青青草视频 | 长腿女神打扫偷懒被主人猛操惩罚 |