zoukankan      html  css  js  c++  java
  • 单例模式

    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/

    声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接

  • 相关阅读:
    动画02
    动画01
    css过渡
    06强制类型转换
    05强制类型转换
    jetson 安装opencv4.4.0
    cpp中的内置异常
    cpp中std::string和std::wstring 相互转换
    qt creator杂记
    win10 git bash 使用vim 显示 git log
  • 原文地址:https://www.cnblogs.com/phpstudy2015-6/p/6731707.html
Copyright © 2011-2022 走看看