1、简介
1.1、定义
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
1.2、单例模式模式四要素
- 私有的构造方法
- 私有克隆方法
- 指向自己实例的私有静态引用
- 以自己实例为返回值的静态的公有的方法
1.3、单例模式根据实例化对象时机的不同分为两种
一种是饿汉式单例,饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;
一种是懒汉式单例,而懒汉式在调用取得实例方法的时候才会实例化对象。
1.4、单例模式优点
- 在内存中只有一个对象,节省内存空间。
- 避免频繁的创建销毁对象,可以提高性能。
- 避免对共享资源的多重占用。
- 可以全局访问。
1.5、适用场景
- 需要频繁实例化然后销毁的对象。
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
- 有状态的工具类对象。
- 频繁访问数据库或文件的对象。
- 。。。。。
2、PHP代码实现
1 <?php 2 #单例模式 3 class Singleton 4 { 5 private static $_instance; 6 private function __construct(){} #私有构造方法 7 private function __clone(){} #私有克隆方法 8 public static function getInstance() #静态共有方法实例化对象 9 { 10 if(!(self::$_instance instanceof self)) 11 { 12 self::$_instance=new self(); #指向实例的私有静态引用 13 } 14 return self::$_instance; 15 } 16 17 } 18 19 ?>
3、融合memcached的单例模式
想到memcached能够存储对象,灵光一闪如果将实例化的对象存储在memcached内存中,需要就拿出来。那样就可以避免每次循环执行脚本都要实例化,这不就从单例模式的基础上更进一步了么。
撸起袖子那就开干啦,下面的代码就是将memcached融合到了单例模式中的类。
【注意注意】:
这里将memcached融合到单例模式中仅仅只是用来进行实验测试(实现自己脑子里的想法),最终结果能否优化啥的,暂时不知道。
1 <?php 2 #单例模式+memcached(使用内存的单例模式) 3 class Singleton 4 { 5 private static $_instance; 6 private function __construct(){} 7 private function __clone(){} 8 public static function getInstance() 9 { 10 if(!(self::$_instance instanceof self)) #检查$_instance有没有对象 11 { 12 #在memcached查询看存不存在此类的对象 13 $m=new memcached(); 14 $m->addserver('192.168.95.11', 11211); 15 $singleton=$m->get('singleton'); 16 if($singleton) #存在 17 { 18 #测试---start 19 echo "memcached中有object:<br/>"; 20 echo "<pre>"; 21 var_dump($singleton); 22 echo "</pre><hr/>"; 23 #测试---end 24 self::$_instance=$singleton; 25 } 26 else #不存在,在进行单例生成对象 27 { 28 #测试---start 29 echo "memcached中不存在object<br/><hr/>"; 30 #测试---end 31 self::$_instance=new self(); 32 echo "new object<br/>"; 33 $m->set('singleton', self::$_instance); 34 } 35 36 } 37 return self::$_instance; 38 } 39 40 public function test() 41 { 42 echo "this is test!<br/>"; 43 } 44 45 } 46 47 header("content-type:text/html;charset=utf8;"); 48 $obj=Singleton::getInstance(); 49 $obj->test(); 50 echo "<pre>"; 51 var_dump($obj); 52 echo "</pre>"; 53 54 55 $obj2=Singleton::getInstance(); 56 $obj2->test(); 57 echo "<pre>"; 58 var_dump($obj2); 59 echo "</pre>";die; 60 61 ?>
第一次访问:
第二次访问:
memcached中:
(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)
作者:那一叶随风 http://www.cnblogs.com/phpstudy2015-6/
声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接