Singleton: 单例模式

在这里插入图片描述

解释

单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点
单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点
单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点

在这里插入图片描述

适用场景

  • 整个程序的运行中只允许有一个类的实例。
  • 需要频繁实例化然后销毁的对象。
  • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  • 整个程序的运行中只允许有一个类的实例。
  • 需要频繁实例化然后销毁的对象。
  • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。

在这里插入图片描述

优点

  • 减少内存的开支,避免频繁地创建销毁对象;
  • 减少系统的性能开销,提高对象访问速度
  • 避免对资源的多重占用,如文件操作等;
  • 优化和共享资源访问,如配置文件等。
  • 减少内存的开支,避免频繁地创建销毁对象;
  • 减少系统的性能开销,提高对象访问速度
  • 避免对资源的多重占用,如文件操作等;
  • 优化和共享资源访问,如配置文件等。

在这里插入图片描述

缺点

  • 没有抽象层,不能继承扩展很难
  • 违背了“单一职责原则”,一个类只重视内部关系,而忽略外部关系
  • 不适用于变化对象,如多线程环境下可能出现问题。
  • 没有抽象层,不能继承扩展很难
  • 违背了“单一职责原则”,一个类只重视内部关系,而忽略外部关系
  • 不适用于变化对象,如多线程环境下可能出现问题。

在这里插入图片描述

代码实现

在这里插入图片描述

PHP
class Database {
    private static $instance = null;
    private $connection;

    private function __construct() {
        $this->connection = mysqli_connect('localhost', 'user', 'password', 'database');
    }

    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    public function getConnection() {
        return $this->connection;
    }
}

// 使用示例
$database = Database::getInstance();
$connection = $database->getConnection();

在这里插入图片描述

Go
package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

var db *sql.DB
var once sync.Once

func GetDB() *sql.DB {
	once.Do(func() {
		var err error
		dsn := "user:password@tcp(localhost:3306)/database"
		db, err = sql.Open("mysql", dsn)
		if err != nil {
			panic(err)
		}
	})
	return db
}

func main() {
	// 获取单例数据库连接
	conn := GetDB()
	fmt.Println(conn)

	// 尝试再次获取数据库连接,应该得到相同的实例
	conn2 := GetDB()
	fmt.Println(conn2)

	// 关闭数据库连接
	err := conn.Close()
	if err != nil {
		panic(err)
	}
}

在这里插入图片描述

Java
public class DatabaseConnection {

    // 声明一个私有的静态变量,用于保存唯一的实例对象
    private static DatabaseConnection instance;

    // 声明私有的构造方法,避免在其他类中通过new关键字创建对象
    private DatabaseConnection() {
        // 实现数据库连接的初始化
    }

    // 声明公有的静态方法,用于获取唯一的实例对象
    public static synchronized DatabaseConnection getInstance() {
        // 判断实例对象是否已经存在
        if (instance == null) {
            // 如果实例对象不存在,则创建一个新的实例对象
            instance = new DatabaseConnection();
        }
        // 返回唯一的实例对象
        return instance;
    }

    // 声明其他公有的方法,用于实现数据库操作
    public void executeQuery(String sql) {
        // 实现数据库查询操作
    }

    public void executeUpdate(String sql) {
        // 实现数据库更新操作
    }

    // 在类中实现其他功能...
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Slowlyo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值