
介绍
wiki:单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用
getInstance
这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。
角色
角色 | 说明 |
---|---|
Single | 单例类 |
角色示例
类名 | 担任角色 | 说明 |
---|---|---|
TaskManager | Single | 单例类,实现任务管理器 |
UML类图

代码
<?php
class TaskManager
{
private static $instance;
private static $taskList;
private static $taskcount;
//私有构造方法,禁止使用new创建对象
private function __construct(){
self::$taskcount++;
$this->taskList = [];
}
public static function getInstance(){
if (!isset(self::$instance)) {
self::$instance = new self;
}
return self::$instance;
}
//将克隆方法设为私有,禁止克隆对象
private function __clone(){}
public function listTask()
{
return $this->taskList;
}
public function setTask($taskList)
{
$this->taskList = array_merge($this->taskList, $taskList);
}
public function getTask($taskId)
{
return $this->taskList[$taskId];
}
}
$taskManager = TaskManager::getInstance();
$taskManager->setTask(
['php','nginx','mysql','redis']
);
$taskManager->setTask(
['elasticsearch','python']
);
echo $taskManager->getTask(3).PHP_EOL;
echo $taskManager->getTask(5).PHP_EOL;
var_dump($taskManager->listTask());
创建 TaskManager.php,内容如上。
执行
$ php TaskManager.php
redis
python
array(6) {
[0]=>
string(3) "php"
[1]=>
string(5) "nginx"
[2]=>
string(5) "mysql"
[3]=>
string(5) "redis"
[4]=>
string(13) "elasticsearch"
[5]=>
string(6) "python"
}
网友评论