1. 程式人生 > >PHP設計模式之單例模式瞭解下

PHP設計模式之單例模式瞭解下

單例模式,是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項,即一個類只有一個物件例項。通俗來講就是通過提供自身共享例項的訪問,單例設計模式用於限制特定物件只能被建立一次,來看下這個單例模式的要點:

1.一個類只能有一個物件;

2.必須是自行建立這個類的物件;

3,要想整個系統提供這一個物件;

從具體實現的角度來說,可以按著下面這三點來理解:

一是單例模式的類只提供私有的建構函式,

二是類定義中含有一個該類的靜態私有物件,

三是該類提供了一個靜態的公有的函式用於建立或獲取它本身的靜態私有物件。

最主要的就是還要有一個private的clone方法,防止克隆,得記得哈。

優點如下:

一、例項控制

單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。

二、靈活性

因為類控制了例項化過程,所以類可以靈活更改例項化過程。

缺點如下:

一、開銷

雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。

二、可能的開發混淆

使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫原始碼,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。

三、物件生存期

不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.NET Framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 C++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用。

來看下咱寫的案例 :

class Test{

    static private $instance;
    private $age;
    private $name;

    private function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
        echo "construct".PHP_EOL;
    }

    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    static public function set_name($name,$age)
    {
        if (!self::$instance instanceof self) {
             self::$instance = new self($name,$age);
         }
         return self::$instance;
    }

    public function get_name()
    {
        echo $this -> name.PHP_EOL;
        echo $this -> age.PHP_EOL;
    }

}

$object_1 = Test::set_name("cuijinpeng","26");
$object_1->get_name();
echo "<br>";
$object_2 = Test::set_name("luyaran","27");
$object_2->get_name();

從上述例項中,我們可以看出,$object_1建立物件後,引數是"cuijinpeng","26",但是$object_2並沒有建立物件,而是直接使用$instance儲存的唯一物件,所以輸出的引數並沒有變為"luyaran","27"。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。