美文网首页
设计模式之单例模式

设计模式之单例模式

作者: 路漫漫在狂奔 | 来源:发表于2016-12-27 16:59 被阅读49次

学习任何知识,都应当尝试带着问题去学。
----路漫漫

它是干嘛的?

在项目中,保证我们使用的对象是同一个
提个问题 : $db1 = new Mysql();$db2 = new Mysql();这两个对象是一个么?

什么情况用它?

一般的web项目中,数据库一般就一个,这时我们当然希望在项目里只存在一个数据库对象。当我们在不同地方new mysql()对象时,你得到这个mysql对象却不是一个!我怎么知道的?看代码

class Mysql{}
$db1 = new Mysql();
$db2 = new Mysql();
if($db1 === $db2){
    echo 1;
}else{
    echo 0;
}
//运行看看你就知道喽

怎么写呢?

  • 把new的权限回收到内部,一定是private
    class Mysql {
        private function __construct() {
        }
    }
    //你还new的出来么?
    
  • 开放一个获取对象接口
    class Mysql {
       protected static $obj = null;
    
       private function __construct() {
       }
    
       public static function Ins(){
           if (self::$obj===null){
               self::$obj = new self();
           }
           return self::$obj;
       }
    }
    //现在new控制权已经牢牢控制在我们手里了
    
  • 你以为这就完了?别忘还有克隆!
    class Mysql {
         protected static $obj = null;
     
         private function __construct() {
             
         }
         //单例目的就是统一管理对象,所以直接关闭clone就好
         //想要对象?去找Ins()
         private function __clone() {
     
         }
     
         public static function Ins(){
             if (self::$obj===null){
                 self::$obj = new self();
             }
             return self::$obj;
         }
     }
    

NOW,你可以大声告诉别人,你会单例

相关文章

网友评论

      本文标题:设计模式之单例模式

      本文链接:https://www.haomeiwen.com/subject/ywlevttx.html