初识设计模式——单例模式(Singleton Pattern)

cuixiaogang

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这意味着无论在应用程序的哪个地方调用该类,都会返回同一个实例对象,而不是创建新的对象。

单例模式的实现步骤

  1. 私有构造函数:防止类外部使用 new 关键字创建新的实例。
  2. 私有静态变量:用于存储类的唯一实例。
  3. 公共静态方法:提供全局访问点,用于获取类的唯一实例。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
class Singleton {
// 私有静态变量,用于存储类的唯一实例
private static $instance;

// 私有构造函数,防止外部使用 new 关键字创建新的实例
private function __construct() {}

// 防止对象被克隆
private function __clone() {}

// 防止对象被反序列化
private function __wakeup() {}

// 公共静态方法,用于获取类的唯一实例
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}

// 示例方法
public function doSomething() {
return "Singleton is doing something.";
}
}

// 使用示例
$singleton = Singleton::getInstance();
echo $singleton->doSomething();
?>

单例模式的优缺点

优点

  • 全局访问:提供了一个全局访问点,方便在应用程序的任何地方访问该实例。
  • 资源共享:确保一个类只有一个实例,避免了资源的浪费,例如数据库连接、文件操作等。
  • 严格控制:可以严格控制对实例的创建和访问,确保数据的一致性和安全性。

缺点

  • 违反单一职责原则:单例类既负责自身的实例化,又负责提供业务逻辑,违背了单一职责原则。
  • 可测试性降低:由于单例类的全局访问性,在进行单元测试时可能会引入外部依赖,增加了测试的难度。
  • 内存泄漏风险:单例对象在整个应用程序的生命周期内都存在,如果不合理使用,可能会导致内存泄漏。

单例模式的适用场景

  • 配置管理:在应用程序中,配置信息通常只需要一个实例来管理,例如数据库连接配置、应用程序的全局设置等。
  • 日志记录:日志记录器通常是单例的,因为多个日志记录器可能会导致日志文件的混乱和不一致。
  • 资源管理:如数据库连接池、线程池等,通过单例模式可以确保资源的有效管理和共享。
On this page
初识设计模式——单例模式(Singleton Pattern)