基礎設計模式:單例模式+工廠模式+注冊樹模式

基礎設計模式:單例模式+工廠模式+注冊樹模式

單例模式:

通過提供自身共享實例的訪問,單例設計模式用于限制特定對象只能被創(chuàng)建一次。

使用場景:

一般數(shù)據(jù)庫實例都會用單例模式

實現(xiàn):

單例設計模式就是要一個類只能實例化一個對象。

要想讓一個類只能實例化一個對象,就要讓類先不能實例化對象,就是構造方法私有。

現(xiàn)在,要想實例化該類必須通過訪問靜態(tài)方法來實例化改類

為了防止實例多次,需要通過一個成員變量來控制加以判斷

因為靜態(tài)方法不能訪問非靜態(tài)成員,所以聲明的成員也要是靜態(tài)的,同時防止外部訪問該成員,還要私有

class Singleton{
    
    private static $_instance;  //聲明一個私有的,靜態(tài)的成員屬性$instance;
    
    private function __construct(){}  //構造方法私有,防止new實例化。
    
    public static function getInstance(){     //只能通過靜態(tài)方法實例化對象
            if( !( self::$_instance instanceof Singleton ) )
                self::$_instance = new self();
                
            return self::$obj;
    }
    
    private function __clone(){} //防止clone對象。
  
    private function __wakeup(){} //防止使用序列化。
  
    function query($sql){
        echo $sql;
    }
}

/*通過靜態(tài)方法實例化*/
$db = Singleton::getInstance();

//訪問對象中的成員
$db->query("select * from user");  
工廠模式:

工廠類就是一個專門用來創(chuàng)建其它對象的類。所有地方加載類都走工廠方法。

注冊樹模式:

小工程并不實用,對于大工程方便管理生成對象。

三個模式的結合使用:

一個數(shù)據(jù)庫的單例模式,通過工廠方法調(diào)用,生成的對象注冊到注冊樹中。

<?php

/**
 * 單例模式
 */
trait Singleton
{
    private static $_instance;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (!(self::$_instance instanceof Singleton)) {
            self::$_instance = new Static();
        }

        return self::$_instance;
    }

    final private function __clone()
    {
    }
}

/**
 * 數(shù)據(jù)庫類,通過trait使用單例模式
 */
class Database{
    use Singleton;

    public function query($sql)
    {
        //return ret...
    }
}

/**
 * 工廠方法,生成對象
 */
class Loader
{
    /**
     * 創(chuàng)建對象方法,創(chuàng)建成功加入注冊樹
     * @param $cls
     * @return null|static
     */
    public static function loadObject($cls)
    {
        $obj = ObjectFinder::find($cls);
        if (!is_object($obj)) {
            $obj = $cls::getInstance();
            ObjectFinder::register($cls, $obj);
        }

        return $obj;
    }
}

/**
 * 注冊樹類,存取工廠創(chuàng)建好的對象
 */
class ObjectFinder
{
    protected static $_object;

    /**
     * 獲取類對應的對象
     * @param $cls
     * @return null
     */
    public static function find($cls)
    {
        if (isset(self::$_object[$cls])) {
            return self::$_object[$cls];
        }
        return null;
    }

    /**
     * 注冊對象
     * @param $cls
     * @param $obj
     * @return bool
     */
    public static function register($cls, $obj)
    {
        if (!is_object($obj) || isset(self::$_object[$cls])) {
            return false;
        }

        self::$_object[$cls] = $obj;
        return true;
    }

    /**
     * 銷毀對象
     * @param $cls
     */
    public static function destory($cls)
    {
        if (self::find($cls)) {
            unset(self::$_object[$cls]);
        }
    }
}

//創(chuàng)建一個
$db = Loader::loadObject("Database");
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,285評論 4 34
  • 1 單例模式的動機 對于一個軟件系統(tǒng)的某些類而言,我們無須創(chuàng)建多個實例。舉個大家都熟知的例子——Windows任務...
    justCode_閱讀 1,440評論 2 9
  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,961評論 1 15
  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,529評論 1 8
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139