😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘
🤗专栏:算法学习
🤗专栏:Go实战
💬个人主页:个人主页
文章目录
- 设计模式是什么?
- 单例模式概念
- 单例设计模式实例:计数器
设计模式是什么?
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案,用设计模式是为了复用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式的六大原则:
- 开闭原则
有开有闭原则,对扩展开放,但是对修改关闭。可以在程序需要拓展的时候使用,但是不能修改原有的代码来实现扩展。 - 里氏代换原则
子类可以扩展父类的功能,但不能改变原有父类的功能 - 依赖倒转原则
针对接口编程,依赖于抽象而不依赖于具体。简单解释就是面向接口编程,“抽象”就是接口或者抽象类,“具体”值得就是实现类; - 接口隔离原则
使用多个相互隔离的接口开发,比使用单个接口要好。目的是为降低类之间的耦合度。 - 迪米特法则
最少知道原则,尽量降低类与类之间的耦合,一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,防止高耦合度 - 合成复用原则
它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
设计模式分类:
设计模式分为三类:创建型,行为型、结构型
这里主要针对创建型中的单例设计模式进行讲解
创建型:单例、工厂、抽象工厂、建造者、原型模式
单例模式:保证一个类仅有一个对象,并提供一个访问它的全局访问点。
工厂模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化,FactoryMethod使一个类的实例化延迟到其子类。
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
单例模式概念
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。
和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。
适用场景:
1.如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
2.如果你需要更加严格地控制全局变量, 可以使用单例模式。
单例设计模式实例:计数器
下面我以实现一个计数器操作来实现一个简单的单例模式:
流程:
当之前没有创建过计数器 count 时,将创建一个新的计数器 count = 0
如果已经创建了一个计数器,则返回此实例实际保存的 count 数
如果我们调用方法 AddOne 一次,计数 count 必须增加 1
基本格式:
package singleton
// 为单例对象编写包的声明
type Singleton struct {
count int
}
var instance *Singleton
func init() {
instance = &Singleton{}
}
func GetInstance() *Singleton {
if instance == nil {
instance = new(Singleton)
}
return instance
}
func (s *Singleton) AddOne() int {
s.count++
return s.count
}
测试:
package singleton
import "testing"
// 测试
func TestGetInstance(t *testing.T) {
count := GetInstance()
if count == nil {
t.Error("A new connextion object must have been made ")
}
expectedCounter := count
currentCount := count.AddOne()
if currentCount != 1 {
t.Errorf("After calling for the first time to count,the count must be 1 but it is %d\n", currentCount)
}
count2 := GetInstance()
if count2 != expectedCounter {
t.Error("Singleton instances must be different")
}
currentCount = count2.AddOne()
if currentCount != 2 {
t.Errorf("After calling 'AddOne' using the second counter, the current count must be 2 but was %d\n", currentCount)
}
}
运行结果:
参考链接:设计模式