Skip to content

go语言实现常见的设计模式

1. 单例模式 (Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

go
package main

import (
	"fmt"
	"sync"
)

type Singleton struct {
}

var (
	instance *Singleton
	once     sync.Once
)

func GetInstance() *Singleton {
	once.Do(func() {
		instance = &Singleton{}
	})
	return instance
}

func main() {
	s1 := GetInstance()
	s2 := GetInstance()

	if s1 == s2 {
		fmt.Println("Both instances are the same.")
	} else {
		fmt.Println("Instances are different.")
	}
}

2. 工厂模式 (Factory Pattern)

工厂模式提供了一种创建对象的方式,隐藏了实例化对象的复杂逻辑。

go
package main

import "fmt"

// Product 是定义了产品接口
type Product interface {
	Use() string
}

// ConcreteProductA 是具体产品A的实现
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
	return "Using ConcreteProductA"
}

// ConcreteProductB 是具体产品B的实现
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
	return "Using ConcreteProductB"
}

// Factory 是工厂结构体
type Factory struct{}

func (f *Factory) CreateProduct(productType string) Product {
	switch productType {
	case "A":
		return &ConcreteProductA{}
	case "B":
		return &ConcreteProductB{}
	default:
		return nil
	}
}

func main() {
	factory := &Factory{}

	productA := factory.CreateProduct("A")
	fmt.Println(productA.Use())

	productB := factory.CreateProduct("B")
	fmt.Println(productB.Use())
}

3. 观察者模式 (Observer Pattern)

观察者模式定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖对象都会收到通知并自动更新。

go
package main

import "fmt"

// Observer 是观察者接口
type Observer interface {
	Update(data string)
}

// Subject 是主题接口
type Subject interface {
	Register(observer Observer)
	Deregister(observer Observer)
	Notify()
}

// ConcreteObserver 是具体的观察者实现
type ConcreteObserver struct {
	name string
}

func (o *ConcreteObserver) Update(data string) {
	fmt.Printf("%s received data: %s\n", o.name, data)
}

// ConcreteSubject 是具体的主题实现
type ConcreteSubject struct {
	observers []Observer
	data      string
}

func (s *ConcreteSubject) Register(observer Observer) {
	s.observers = append(s.observers, observer)
}

func (s *ConcreteSubject) Deregister(observer Observer) {
	for i, o := range s.observers {
		if o == observer {
			s.observers = append(s.observers[:i], s.observers[i+1:]...)
			break
		}
	}
}

func (s *ConcreteSubject) Notify() {
	for _, observer := range s.observers {
		observer.Update(s.data)
	}
}

func (s *ConcreteSubject) SetData(data string) {
	s.data = data
	s.Notify()
}

func main() {
	subject := &ConcreteSubject{}

	observer1 := &ConcreteObserver{name: "Observer1"}
	observer2 := &ConcreteObserver{name: "Observer2"}

	subject.Register(observer1)
	subject.Register(observer2)

	subject.SetData("New Data")
}

4. 策略模式 (Strategy Pattern)

策略模式定义一系列算法,将每个算法封装起来,并使它们可以互换。

go
package main

import "fmt"

// Strategy 是策略接口
type Strategy interface {
	Execute(a, b int) int
}

// ConcreteStrategyAdd 是加法策略的实现
type ConcreteStrategyAdd struct{}

func (s *ConcreteStrategyAdd) Execute(a, b int) int {
	return a + b
}

// ConcreteStrategySubtract 是减法策略的实现
type ConcreteStrategySubtract struct{}

func (s *ConcreteStrategySubtract) Execute(a, b int) int {
	return a - b
}

// Context 是上下文,持有一个策略的引用
type Context struct {
	strategy Strategy
}

func (c *Context) SetStrategy(strategy Strategy) {
	c.strategy = strategy
}

func (c *Context) ExecuteStrategy(a, b int) int {
	return c.strategy.Execute(a, b)
}

func main() {
	context := &Context{}

	context.SetStrategy(&ConcreteStrategyAdd{})
	fmt.Println("Add:", context.ExecuteStrategy(5, 3))

	context.SetStrategy(&ConcreteStrategySubtract{})
	fmt.Println("Subtract:", context.ExecuteStrategy(5, 3))
}

Last updated: