成交型網(wǎng)站倡導(dǎo)公司西安百度網(wǎng)站快速排名
文章目錄
- 創(chuàng)建型模式
- 簡(jiǎn)單工廠模式
- 圖形接口
- 具體圖形類:圓形
- 具體圖形類:矩形
- 工廠類定義
- 使用簡(jiǎn)單工廠模式
- 抽象工廠模式
- 1. 定義產(chǎn)品接口
- 2. 定義具體產(chǎn)品實(shí)現(xiàn)類
- 3. 定義抽象工廠接口
- 4. 定義具體工廠實(shí)現(xiàn)類
- 5. 使用抽象工廠創(chuàng)建對(duì)象并使用產(chǎn)品
- 創(chuàng)建者模式
- 1. 定義產(chǎn)品結(jié)構(gòu)體
- 2. 定義創(chuàng)建者接口和具體創(chuàng)建者結(jié)構(gòu)體
- 3. 定義指揮者結(jié)構(gòu)體
- 4. 使用創(chuàng)建者模式構(gòu)建對(duì)象
- 原型模式
- 定義原型接口和實(shí)現(xiàn)類:
- 使用原型模式創(chuàng)建對(duì)象:
- 單例模式
- 懶漢式單例(線程不安全)
- 懶漢式單例(線程安全)
- 餓漢式單例
- 結(jié)構(gòu)性模式
- 外觀行模式
- DVD 播放器接口和實(shí)現(xiàn)
- 投影儀接口和實(shí)現(xiàn)
- 音響系統(tǒng)接口和實(shí)現(xiàn)
- 外觀類實(shí)現(xiàn)
- 使用外觀模式
創(chuàng)建型模式
簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式是一種創(chuàng)建型設(shè)計(jì)模式。它定義了一個(gè)工廠類,這個(gè)工廠類負(fù)責(zé)創(chuàng)建產(chǎn)品對(duì)象??蛻舳?#xff08;使用產(chǎn)品的代碼)只需要向工廠類請(qǐng)求所需的產(chǎn)品,而不需要知道產(chǎn)品是如何創(chuàng)建的,這樣就將產(chǎn)品的創(chuàng)建和使用分離,使得代碼的結(jié)構(gòu)更加清晰。
假設(shè)我們要?jiǎng)?chuàng)建一個(gè)圖形繪制工具,首先定義一個(gè)圖形接口,然后有不同的圖形類實(shí)現(xiàn)這個(gè)接口。
圖形接口
type Shape interface {Draw()
}
具體圖形類:圓形
type Circle struct{}func (c *Circle) Draw() {println("Drawing a circle")
}
具體圖形類:矩形
type Rectangle struct{}func (r *Rectangle) Draw() {println("Drawing a rectangle")
}
工廠類定義
接著創(chuàng)建簡(jiǎn)單工廠類,用于生產(chǎn)不同的圖形。
type ShapeFactory struct{}func (f *ShapeFactory) CreateShape(shapeType string) Shape {if shapeType == "circle" {return &Circle{}} else if shapeType == "rectangle" {return &Rectangle{}}return nil}
使用簡(jiǎn)單工廠模式
在主函數(shù)或者其他客戶端代碼中,可以這樣使用工廠類來(lái)獲取產(chǎn)品(圖形)并使用。
func main() {factory := &ShapeFactory{}circle := factory.CreateShape("circle")circle.Draw()rectangle := factory.CreateShape("rectangle")rectangle.Draw()}
抽象工廠模式
抽象工廠方法模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種創(chuàng)建對(duì)象的方式,將對(duì)象的創(chuàng)建和使用分離,使得代碼更具靈活性和可維護(hù)性。其核心在于有一個(gè)抽象工廠接口,該接口定義了創(chuàng)建一系列相關(guān)產(chǎn)品對(duì)象的抽象方法,然后由具體的工廠類來(lái)實(shí)現(xiàn)這些抽象方法,創(chuàng)建具體的產(chǎn)品對(duì)象。
1. 定義產(chǎn)品接口
首先,定義一系列相關(guān)的產(chǎn)品接口,比如這里假設(shè)有兩種產(chǎn)品:ProductA和ProductB。
// ProductA接口,代表產(chǎn)品A的抽象
type ProductA interface {Use()
}// ProductB接口,代表產(chǎn)品B的抽象
type ProductB interface {Use()
}
接口中定義了Use方法,用于表示產(chǎn)品的使用行為,具體的產(chǎn)品實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法。
2. 定義具體產(chǎn)品實(shí)現(xiàn)類
接著,創(chuàng)建具體的產(chǎn)品實(shí)現(xiàn)類,分別實(shí)現(xiàn)ProductA和ProductB接口。
// ConcreteProductA1是ProductA接口的一個(gè)具體實(shí)現(xiàn)
type ConcreteProductA1 struct{}func (p *ConcreteProductA1) Use() {println("Using ConcreteProductA1")
}// ConcreteProductA2是ProductA接口的另一個(gè)具體實(shí)現(xiàn)
type ConcreteProductA2 struct{}func (p *ConcreteProductA2) Use() {println("Using ConcreteProductA2")
}// ConcreteProductB1是ProductB接口的一個(gè)具體實(shí)現(xiàn)
type ConcreteProductB1 struct{}func (p *ConcreteProductB1) Use() {println("Using ConcreteProductB1")
}// ConcreteProductB2是ProductB接口的另一個(gè)具體實(shí)現(xiàn)
type ConcreteProductB2 struct{}func (p *ConcreteProductB2) Use() {println("Using ConcreteProductB2")
}
這些具體產(chǎn)品類實(shí)現(xiàn)了各自接口的Use方法,定義了具體的使用行為,比如打印出不同的使用提示信息。
3. 定義抽象工廠接口
然后,定義抽象工廠接口,它聲明了創(chuàng)建ProductA和ProductB的抽象方法。
// AbstractFactory接口,定義創(chuàng)建產(chǎn)品的抽象方法
type AbstractFactory interface {CreateProductA() ProductACreateProductB() ProductB
}
4. 定義具體工廠實(shí)現(xiàn)類
再創(chuàng)建具體的工廠實(shí)現(xiàn)類,實(shí)現(xiàn)抽象工廠接口,根據(jù)具體工廠的邏輯來(lái)創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品。
// ConcreteFactory1是AbstractFactory接口的一個(gè)具體實(shí)現(xiàn),用于創(chuàng)建特定組合的產(chǎn)品
type ConcreteFactory1 struct{}func (f *ConcreteFactory1) CreateProductA() ProductA {return &ConcreteProductA1{}
}func (f *ConcreteFactory1) CreateProductB() ProductB {return &ConcreteProductB1{}
}// ConcreteFactory2是AbstractFactory接口的另一個(gè)具體實(shí)現(xiàn),用于創(chuàng)建另一種組合的產(chǎn)品
type ConcreteFactory2 struct{}func (f *ConcreteFactory2) CreateProductA() ProductA {return &ConcreteProductA2{}
}func (f *ConcreteFactory2) CreateProductB() ProductB {return &ConcreteProductB2{}
}
在這些具體工廠類中,實(shí)現(xiàn)了CreateProductA和CreateProductB方法,分別返回對(duì)應(yīng)的具體產(chǎn)品實(shí)例。
5. 使用抽象工廠創(chuàng)建對(duì)象并使用產(chǎn)品
func main() {// 使用ConcreteFactory1創(chuàng)建產(chǎn)品factory1 := &ConcreteFactory1{}productA1 := factory1.CreateProductA()productB1 := factory1.CreateProductB()productA1.Use()productB1.Use()// 使用ConcreteFactory2創(chuàng)建產(chǎn)品factory2 := &ConcreteFactory2{}productA2 := factory2.CreateProductA()productB2 := factory2.CreateProductB()productA2.Use()productB2.Use()
}
在main函數(shù)中,首先實(shí)例化了不同的具體工廠(這里是ConcreteFactory1和ConcreteFactory2),然后通過(guò)這些工廠分別創(chuàng)建對(duì)應(yīng)的產(chǎn)品實(shí)例,并調(diào)用產(chǎn)品的Use方法來(lái)展示其使用行為。
優(yōu)點(diǎn)
- 解耦對(duì)象創(chuàng)建和使用:使得代碼中創(chuàng)建對(duì)象的部分和使用對(duì)象的部分相互獨(dú)立,便于維護(hù)和擴(kuò)展。例如,當(dāng)需要添加新的具體產(chǎn)品或者改變產(chǎn)品的創(chuàng)建邏輯時(shí),只需要在對(duì)應(yīng)的工廠類和產(chǎn)品類中修改,而不會(huì)影響到使用這些產(chǎn)品的其他代碼。
- 便于代碼的復(fù)用和替換:可以方便地替換具體的工廠實(shí)現(xiàn)類,從而改變創(chuàng)建的產(chǎn)品組合,在不同的應(yīng)用場(chǎng)景下復(fù)用相同的產(chǎn)品接口和使用邏輯。
缺點(diǎn) - 增加代碼復(fù)雜度:由于引入了抽象工廠、具體工廠、產(chǎn)品接口以及多個(gè)具體產(chǎn)品類等多層結(jié)構(gòu),代碼的整體復(fù)雜度會(huì)有所增加,對(duì)于簡(jiǎn)單的應(yīng)用場(chǎng)景可能顯得有些 “大材小用”。
- 不利于理解:對(duì)于不熟悉設(shè)計(jì)模式的開(kāi)發(fā)者來(lái)說(shuō),初次接觸抽象工廠方法模式時(shí),理解其結(jié)構(gòu)和運(yùn)行流程可能需要花費(fèi)一些時(shí)間。
創(chuàng)建者模式
創(chuàng)建者模式是一種創(chuàng)建型設(shè)計(jì)模式,它將一個(gè)復(fù)雜對(duì)象的構(gòu)建過(guò)程和它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。該模式適用于創(chuàng)建對(duì)象的過(guò)程較為復(fù)雜,需要多個(gè)步驟來(lái)完成,并且不同的配置或步驟組合能夠生成不同形態(tài)的對(duì)象的場(chǎng)景。
1. 定義產(chǎn)品結(jié)構(gòu)體
首先,定義要構(gòu)建的復(fù)雜產(chǎn)品對(duì)象,這里以一個(gè)簡(jiǎn)單的 Computer(電腦)結(jié)構(gòu)體為例,它包含多個(gè)部件屬性。
type Computer struct {CPU stringMemory stringStorage stringGPU string
}
2. 定義創(chuàng)建者接口和具體創(chuàng)建者結(jié)構(gòu)體
接著,創(chuàng)建創(chuàng)建者接口,它聲明了構(gòu)建產(chǎn)品各個(gè)部件以及獲取最終產(chǎn)品的抽象方法。然后創(chuàng)建具體的創(chuàng)建者結(jié)構(gòu)體,實(shí)現(xiàn)這些抽象方法來(lái)定義具體的構(gòu)建邏輯。
// Builder接口,定義構(gòu)建電腦各部件及獲取最終電腦的方法
type Builder interface {BuildCPU()BuildMemory()BuildStorage()BuildGPU()GetComputer() *Computer
}// GamingComputerBuilder是實(shí)現(xiàn)Builder接口的具體創(chuàng)建者結(jié)構(gòu)體,用于構(gòu)建游戲電腦
type GamingComputerBuilder struct {computer Computer
}func (b *GamingComputerBuilder) BuildCPU() {b.computer.CPU = "Intel Core i9"
}func (b *GamingComputerBuilder) BuildMemory() {b.computer.Memory = "32GB DDR5"
}func (b *GamingComputerBuilder) BuildStorage() {b.computer.Storage = "1TB NVMe SSD"
}func (b *GamingComputerBuilder) BuildGPU() {b.computer.GPU = "NVIDIA RTX 4090"
}func (b *GamingComputerBuilder) GetComputer() *Computer {return &b.computer
}// OfficeComputerBuilder是實(shí)現(xiàn)Builder接口的另一個(gè)具體創(chuàng)建者結(jié)構(gòu)體,用于構(gòu)建辦公電腦
type OfficeComputerBuilder struct {computer Computer
}func (b *OfficeComputerBuilder) BuildCPU() {b.computer.CPU = "Intel Core i5"
}func (b *OfficeComputerBuilder) BuildMemory() {b.computer.Memory = "16GB DDR4"
}func (b *OfficeComputerBuilder) BuildStorage() {b.computer.Storage = "512GB SATA SSD"
}func (b *OfficeComputerBuilder) BuildGPU() {b.computer.GPU = "Integrated Graphics"
}func (b *OfficeComputerBuilder) GetComputer() *Computer {return &b.computer
}
在上述代碼中,GamingComputerBuilder 按照游戲電腦的配置來(lái)構(gòu)建各個(gè)部件,而 OfficeComputerBuilder 則按照辦公電腦的配置進(jìn)行構(gòu)建,它們都實(shí)現(xiàn)了 Builder 接口的抽象方法,最后通過(guò) GetComputer 方法返回構(gòu)建好的電腦對(duì)象。
3. 定義指揮者結(jié)構(gòu)體
指揮者結(jié)構(gòu)體用于控制構(gòu)建過(guò)程,它接收一個(gè)創(chuàng)建者對(duì)象,并按照特定順序調(diào)用創(chuàng)建者的構(gòu)建方法來(lái)完成產(chǎn)品的構(gòu)建。
// Director結(jié)構(gòu)體,用于協(xié)調(diào)構(gòu)建過(guò)程
type Director struct {builder Builder
}func (d *Director) Construct() *Computer {d.builder.BuildCPU()d.builder.BuildMemory()d.builder.BuildStorage()d.builder.BuildGPU()return d.builder.GetComputer()
}
4. 使用創(chuàng)建者模式構(gòu)建對(duì)象
最后,在 main 函數(shù)中展示如何使用創(chuàng)建者模式來(lái)構(gòu)建不同類型的電腦對(duì)象。
func main() {// 創(chuàng)建游戲電腦gamingBuilder := &GamingComputerBuilder{}gamingDirector := &Director{builder: gamingBuilder}gamingComputer := gamingDirector.Construct()println("Gaming Computer Configuration:")println("CPU:", gamingComputer.CPU)println("Memory:", gamingComputer.Memory)println("Storage:", gamingComputer.Storage)println("GPU:", gamingComputer.GPU)// 創(chuàng)建辦公電腦officeBuilder := &OfficeComputerBuilder{}officeDirector := &Director{builder: officeBuilder}officeComputer := officeDirector.Construct()println("\nOffice Computer Configuration:")println("CPU:", officeComputer.CPU)println("Memory:", officeComputer.Memory)println("Storage:", officeComputer.Storage)println("GPU:", officeComputer.GPU)
}
在 main 函數(shù)中,先分別實(shí)例化了游戲電腦和辦公電腦對(duì)應(yīng)的創(chuàng)建者和指揮者,然后通過(guò)指揮者調(diào)用構(gòu)建過(guò)程來(lái)獲取構(gòu)建好的電腦對(duì)象,并打印出它們的配置信息。
優(yōu)點(diǎn)
- 解耦構(gòu)建過(guò)程和產(chǎn)品表示:使得構(gòu)建復(fù)雜對(duì)象的代碼與對(duì)象本身的結(jié)構(gòu)和表示分離,方便對(duì)構(gòu)建過(guò)程進(jìn)行修改和擴(kuò)展,而不影響產(chǎn)品的使用邏輯。
- 便于精細(xì)化控制構(gòu)建過(guò)程:可以通過(guò)指揮者精確地控制構(gòu)建步驟的順序,并且能夠根據(jù)不同需求靈活地使用不同的創(chuàng)建者來(lái)構(gòu)建多種形態(tài)的產(chǎn)品。
- 提高代碼可讀性和可維護(hù)性:將復(fù)雜的構(gòu)建邏輯封裝在創(chuàng)建者和指揮者中,使得代碼結(jié)構(gòu)更加清晰,易于理解和維護(hù),尤其是在構(gòu)建過(guò)程涉及多個(gè)步驟和多種配置的情況下。
缺點(diǎn) - 增加代碼復(fù)雜度:引入了創(chuàng)建者、指揮者等額外的結(jié)構(gòu)體和接口,相比簡(jiǎn)單直接創(chuàng)建對(duì)象的方式,代碼結(jié)構(gòu)變得更復(fù)雜,對(duì)于簡(jiǎn)單的創(chuàng)建對(duì)象場(chǎng)景可能會(huì)顯得有些繁瑣。
- 需要額外的代碼管理:要維護(hù)創(chuàng)建者、指揮者以及它們與產(chǎn)品之間的關(guān)系,需要更多的代碼來(lái)進(jìn)行管理和協(xié)調(diào),增加了一定的開(kāi)發(fā)成本。
原型模式
原型模式是一種創(chuàng)建型設(shè)計(jì)模式。它的核心思想是通過(guò)復(fù)制一個(gè)已經(jīng)存在的對(duì)象(原型)來(lái)創(chuàng)建新的對(duì)象,而不是通過(guò)傳統(tǒng)的使用構(gòu)造函數(shù)來(lái)初始化對(duì)象。這就好比是克隆,以一個(gè)原始對(duì)象為藍(lán)本,快速制造出與其相似的新對(duì)象。
定義原型接口和實(shí)現(xiàn)類:
首先定義一個(gè)原型接口,這個(gè)接口有一個(gè)方法用于克隆對(duì)象。假設(shè)我們要?jiǎng)?chuàng)建一個(gè)圖形的原型模式,接口如下:
type Shape interface {Clone() Shape
}
然后創(chuàng)建具體的圖形類實(shí)現(xiàn)這個(gè)接口。以矩形(Rectangle)為例:
type Rectangle struct {width float64height float64
}
func (r *Rectangle) Clone() Shape {return &Rectangle{width: r.width,height: r.height,}
}
使用原型模式創(chuàng)建對(duì)象:
在主函數(shù)或者其他需要?jiǎng)?chuàng)建對(duì)象的地方,可以這樣使用原型模式。
func main() {originalRectangle := &Rectangle{width: 10, height: 20}clonedRectangle := originalRectangle.Clone().(*Rectangle)// 驗(yàn)證克隆后的對(duì)象是否和原對(duì)象相同(除了內(nèi)存地址)if originalRectangle.width == clonedRectangle.width && originalRectangle.height == clonedRectangle.height {println("克隆成功")}
}
單例模式
單例模式是一種創(chuàng)建型設(shè)計(jì)模式,它確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)來(lái)訪問(wèn)這個(gè)實(shí)例。就好像在一個(gè)應(yīng)用程序中,某些資源(如數(shù)據(jù)庫(kù)連接池、配置管理器等)只需要一個(gè)實(shí)例存在,以避免資源浪費(fèi)或數(shù)據(jù)不一致等問(wèn)題。
懶漢式單例(線程不安全)
這種方式是在第一次調(diào)用獲取實(shí)例的方法時(shí)才創(chuàng)建實(shí)例。
type Singleton struct{}var instance *Singletonfunc GetInstance() *Singleton {if instance == nil {instance = &Singleton{}}return instance
}
懶漢式單例(線程安全)
為了解決上述問(wèn)題,可以使用互斥鎖來(lái)保證在多線程環(huán)境下的安全。
import ("sync"
)type Singleton struct{}var (instance *Singletonmutex sync.Mutex
)func GetInstance() *Singleton {mutex.Lock()defer mutex.Unlock()if instance == nil {instance = &Singleton{}}return instance
}
這里使用了sync.Mutex互斥鎖,在獲取實(shí)例的方法中,先加鎖,然后判斷實(shí)例是否為nil,如果是則創(chuàng)建實(shí)例,最后解鎖。這樣就保證了在多線程環(huán)境下只有一個(gè)實(shí)例被創(chuàng)建。
餓漢式單例
這種方式是在程序啟動(dòng)時(shí)就創(chuàng)建好實(shí)例,而不是等到第一次調(diào)用獲取實(shí)例的方法時(shí)。
type Singleton struct{}var instance = &Singleton{}func GetInstance() *Singleton {return instance
}
結(jié)構(gòu)性模式
外觀行模式
外觀模式(Facade Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式。它為復(fù)雜的子系統(tǒng)提供了一個(gè)統(tǒng)一的、簡(jiǎn)化的接口,隱藏了子系統(tǒng)的復(fù)雜性和內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。就好像給一個(gè)復(fù)雜的機(jī)器(子系統(tǒng))安裝了一個(gè)簡(jiǎn)單的控制面板(外觀類),用戶通過(guò)操作這個(gè)控制面板就能輕松地使用機(jī)器,而無(wú)需了解機(jī)器內(nèi)部復(fù)雜的結(jié)構(gòu)和運(yùn)作原理。
假設(shè)場(chǎng)景:家庭影院系統(tǒng)
家庭影院系統(tǒng)通常包括多個(gè)復(fù)雜的子系統(tǒng),如 DVD 播放器、投影儀、音響系統(tǒng)等。首先定義這些子系統(tǒng)的接口和實(shí)現(xiàn)。
DVD 播放器接口和實(shí)現(xiàn)
type DVDPlayer interface {On()Off()Play(movie string)Stop()
}type dvdPlayer struct{}func (d *dvdPlayer) On() {println("DVD player is on")
}func (d *dvdPlayer) Off() {println("DVD player is off")
}func (d *dvdPlayer) Play(movie string) {println("Playing movie:", movie)
}func (d *dvdPlayer) Stop() {println("DVD player stopped")
}
投影儀接口和實(shí)現(xiàn)
type Projector interface {On()Off()Project(image string)
}type projector struct{}func (p *projector) On() {println("Projector is on")
}func (p *projector) Off() {println("Projector is off")
}func (p *projector) Project(image string) {println("Projecting image:", image)
}
音響系統(tǒng)接口和實(shí)現(xiàn)
type SoundSystem interface {On()Off()SetVolume(volume int)
}type soundSystem struct{}func (s *soundSystem) On() {println("Sound system is on")
}func (s *soundSystem) Off() {println("Sound system is off")
}func (s *soundSystem) SetVolume(volume int) {println("Setting sound volume to:", volume)
}
外觀類實(shí)現(xiàn)
現(xiàn)在創(chuàng)建外觀類來(lái)提供家庭影院系統(tǒng)的簡(jiǎn)單統(tǒng)一接口。
type HomeTheaterFacade struct {dvdPlayer DVDPlayerprojector ProjectorsoundSystem SoundSystem
}func NewHomeTheaterFacade() *HomeTheaterFacade {return &HomeTheaterFacade{dvdPlayer: &dvdPlayer{},projector: &projector{},soundSystem: &soundSystem{},}
}func (h *HomeTheaterFacade) WatchMovie(movie string) {h.dvdPlayer.On()h.projector.On()h.soundSystem.On()h.soundSystem.SetVolume(10)h.dvdPlayer.Play(movie)h.projector.Project("Movie Image")
}func (h *HomeTheaterFacade) EndMovie() {h.dvdPlayer.Stop()h.dvdPlayer.Off()h.projector.Off()h.soundSystem.Off()
}
使用外觀模式
在主函數(shù)中,可以這樣使用外觀類來(lái)操作家庭影院系統(tǒng)。
func main() {homeTheater := NewHomeTheaterFacade()homeTheater.WatchMovie("Avatar")homeTheater.EndMovie()}