介绍一下单例的应用场景:最简单的场景就是数据库了, 还有框架中基础的应用配置加载了,使用单例模式有如下好处,避免过多的new对象造成大量资源廊坊和超出最大连接数而产生应用down机问题,可以全局设立一个单访问点避免多出访问点造成难以维护的现象,便于调试直接可以设立日志记录全局设立统一节点,避免导出var_dump,print_r的现象

一、类图

单例设计图
单例相对结构上比较简单,总体实现想法就是全局设立一个访问点,全局共同使用一个对象,不会创建多余的对象。

二、实现思路

完成单例需要满足以下需求:
1、全局隐藏私有构造方法,预防通过new来创建对象。
2、隐藏私有克隆方法,预防通过克隆创建对象
3、对外暴露一个静态的Instance方法提供统一对外的获取对象的方式

三、实现单例模式

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
class Singleton
{
//存放实例
private static $_instance = null;

//私有化构造方法、
private function __construct()
{
throw new Exception("禁止构造");
}

//私有化克隆方法
private function __clone()
{

}

//公有化获取实例方法
public static function getInstance()
{
if (!(self::$_instance instanceof Singleton)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
}

通过Singleon::getInstance();来使用单例


2、使用trait方式实现

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
//PHP trait 使用                                     
Trait Singleton{
//存储实例
private static $_instance = null;

//私有化克隆方法
private function __clone(){}

//提供统一对外的实例方法
public static function getInstance(){
$class = __CLASS__;
if (!(self::$_instance instanceof $class)){
self::$_instance = new $class();
}
return self::$_instance;
}
}

class DB{
use Singleton;

private function __construct()
{
echo '实例被创建了';
}
}


DB::getInstance();

好了今天的单例就到这里,以后会陆续上其它的设计模式,并且会通过PHP和JAVA两种语言或者多种来去实现来加深印象,好的设计模式能让系统更加的简介代码复用更高,大家努力学习吧