单例模式

单例模式

单例模式(Singleton Pattern)是比较简单的设计模式之一。属于创建型模式,它提供了一种创建对象的最佳方式。它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

适用场景

当需要控制实例数量,节省系统资源时。如 : 初始化配置,初始化数据库连接池、初始化某个全局工具包等。

应用示例

示例场景

在项目中我们经常需要操作数据库,并创建对应的数据库连接池,这个连接池应该是全局唯一的,可以避免多个连接池产生大量连接的问题。

使用 GO 语言实现单例模式

package main

import (
	"log"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type DBConfig struct {
	Host     string
	Port     string
	Username string
	Password string
	Database string
	Charset  string
}

// 全局变量 MysqlDB
var MysqlDB *gorm.DB

func NewDBPoll(dbConfig DBConfig) error {
	// 判断全局变量 MysqlDB 是否为空,如果为空则创建连接池
	if MysqlDB == nil {
		// 初始化连接池
		log.Println("初始化连接池")
		dsn := dbConfig.Username + ":" + dbConfig.Password +
			"@tcp(" + dbConfig.Host + ":" + dbConfig.Port + ")/" +
			dbConfig.Database +
			"?charset=" + dbConfig.Charset + "&parseTime=True&loc=Local"
		db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
		if err != nil {
			return err
		}
		MysqlDB = db
	}
	return nil
}

func main() {
	dbConfig := DBConfig{
		Host:     "localhost",
		Port:     "3306",
		Username: "root",
		Password: "root",
		Database: "test",
		Charset:  "utf8mb4",
	}
	err := NewDBPoll(dbConfig)
	if err != nil {
		panic(err)
	}
	log.Println("数据库连接成功 ...1")

	// 多次调用 NewDBPoll() ,只会执行一次初始化连接池
	err = NewDBPoll(dbConfig)
	if err != nil {
		panic(err)
	}
	log.Println("数据库连接成功 ...2")
}