单例模式
- 能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
- 一个类只能有一个实例且该实例只能自己创建。
1 <?php
2 class Singleton
3 {
4 //添加私有静态成员变量用于保存单例实例
5 private static $instance;
6
7 //申明公有静态方法用于获取单例实例
8 public static function getInstance()
9 {
10 if (empty(self::$instance)) self::$instance = new self();
11
12 return self::$instance;
13 }
14
15 //私有默认构造方法,保证外界无法直接实例化
16 private function __construct()
17 {
18 }
19
20 //防止用户克隆实例
21 public function __clone()
22 {
23 die('clone is not allow');
24 }
25
26 public function test()
27 {
28 echo 'Singleton test is success';
29 }
30 }
- 使用场景
1、想控制实例数目,节省系统资源的时候。如数据库连接、类方法封装(方法不使用关键字 static,通过 $instance 来调用不同方法)
2、需要更加严格地控制全局变量, 可以使用单例模式。
- 优点
1、在内存里只有一个实例,仅在首次请求单例对象时对其进行初始化,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
3、获得了一个指向该实例的全局访问节点。
- 缺点
1、没有接口,无法继承。
2、该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
3、违反单一职责原则。