解释
单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例
,并提供一个全局访问点
。
单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例
,并提供一个全局访问点
。
单例模式是一种常见的设计模式,它的核心思想是确保一个类只有一个实例
,并提供一个全局访问点
。
适用场景
- 整个程序的运行中只允许有一个类的实例。
- 需要频繁
实例化
然后销毁
的对象。 - 创建对象时耗时过多或者
耗资源过多
,但又经常用到
的对象。 - 整个程序的运行中只允许有一个类的实例。
- 需要频繁
实例化
然后销毁
的对象。 - 创建对象时耗时过多或者
耗资源过多
,但又经常用到
的对象。
优点
- 减少内存的开支,
避免
频繁地创建销毁对象; - 减少系统的性能开销,提高对象
访问速度
; - 避免对资源的多重占用,如文件操作等;
- 优化和共享资源访问,如
配置文件
等。 - 减少内存的开支,
避免
频繁地创建销毁对象; - 减少系统的性能开销,提高对象
访问速度
; - 避免对资源的多重占用,如文件操作等;
- 优化和共享资源访问,如
配置文件
等。
缺点
- 没有抽象层,不能继承
扩展很难
; - 违背了“单一职责原则”,一个类只重视
内部关系
,而忽略外部关系
; - 不适用于变化对象,如
多线程
环境下可能出现问题。 - 没有抽象层,不能继承
扩展很难
; - 违背了“单一职责原则”,一个类只重视
内部关系
,而忽略外部关系
; - 不适用于变化对象,如
多线程
环境下可能出现问题。
代码实现
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) {
// 实现数据库更新操作
}
// 在类中实现其他功能...
}