Design-Patterns-Golang/

directory
v0.0.0-...-48c9e09 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 23, 2019 License: MIT

README

Golang 设计模式

目录

1.单列模式

为了实现Singleton模式,我们有不同的方法,但它们都有以下常见概念。

  • 私有构造函数,用于限制其他类的实例化。
  • 同一个类的私有静态变量,它是该类的唯一实例。
  • 返回类实例的公共静态方法,这是外部世界获取单例类实例的全局访问点。
1.1 Eager initialization(饿汉方式)

在急切的初始化中,Singleton类的实例是在类加载时创建的,这是创建单例类的最简单方法,但它有一个缺点,即即使客户端应用程序可能没有使用它,也会创建实例。

缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。

实现
type SingletonLazy struct{}

var insSingletonLazy *SingletonLazy

// 获取懒汉模式对象
func GetInstanceSingletonLazy() *SingletonLazy {
	if insSingletonLazy == nil {
		insSingletonLazy = &SingletonLazy{}
	}
	return insSingletonLazy
}
测试
t.Run("TesSingletonLazy...", func(t *testing.T) {
    ins1 := GetInstanceSingletonLazy()
    ins2 := GetInstanceSingletonLazy()
    if ins1 != ins2 {
        t.Fatal("instance is not equal")
    }
})
1.2 Lazy Initialization(懒汉初始化)

实现Singleton模式的延迟初始化方法在全局访问方法中创建实例。以下是使用此方法创建Singleton类的示例代码。

缺点:非线程安全。当正在创建时,有线程来访问此时ins = nil就会再创建,单例类就会有多个实例了。

实现
type SingletonEager struct{}

var insSingletonEager *SingletonEager = &SingletonEager{}

// 获取饿汉模式对象
func GetInstanceSingletonEager() *SingletonEager {
	return insSingletonEager
}
测试
t.Run("SingletonEager...", func(t *testing.T) {
    ins1 := GetInstanceSingletonEager()
    ins2 := GetInstanceSingletonEager()
    if ins1 != ins2 {
        t.Fatal("instance is not equal")
    }
})
1.3 Lazy And Lock Initialization(懒汉加锁初始化)

缺点:虽然解决并发的问题,但每次加锁是要付出代价的

实现
type SingletonLazyLock struct{}

var insSingletonLazyLock *SingletonLazyLock
var muSingletonLazyLock sync.Mutex

func GetInstanceSingletonLazyLock() *SingletonLazyLock {
	muSingletonLazyLock.Lock()
	defer muSingletonLazyLock.Unlock()
	if insSingletonLazyLock == nil {
		insSingletonLazyLock = &SingletonLazyLock{}
	}
	return insSingletonLazyLock
}
测试
t.Run("SingletonEager...", func(t *testing.T) {
    ins1 := GetInstanceSingletonLazyLock()
    ins2 := GetInstanceSingletonLazyLock()
    if ins1 != ins2 {
    	
        t.Fatal("instance is not equal")
    }
})

分类

创建型
  • 抽象工厂模式(AbstractFactory)
  • 建造者模式(Builder)
  • 工厂模式(Factory)
  • 原型模式(Prototype)
  • 单例模式(Singleton)
结构型
  • 适配器模式(Adapter)
  • 桥接模式(Bridge)
  • 组合模式(Composite)
  • 装饰器模式(Decorator)
  • 外观模式(Facade)
  • 享元模式(Flyweight)
  • 代理模式(Proxy)
行为型
  • 责任链模式(ChainOfResponsibility)
  • 命令模式(Command)
  • 解释器模式(Interpreter)
  • 迭代器模式(Iterator)
  • 中介者模式(Mediator)
  • 备忘录模式(Memento)
  • 观察者模式(Observer)
  • 状态模式(Strategy)
  • 策略模式(Strategy)
  • 模板模式(Template)
  • 访问者模式(Visitor)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL