1. 程式人生 > >PHP經典設計模式,單例模式、工廠模式、註冊樹模式

PHP經典設計模式,單例模式、工廠模式、註冊樹模式

學習THINKPHP5.1看視訊時的練習

<?php
/**
 * 單例模式
 * 工廠模式
 * 註冊樹模式
 */

// 單例模式,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式
class Site
{
    // 建立屬性
    public $siteName;
    // 建立一個靜態屬性,用於儲存本類的例項
    public static $instance = null;
    // 建立私有構造器,也就是禁用構造器
    // 建構函式私有化後,不能再使用 new 外部呼叫,私有方法只能類內部使用。
    private function __construct($siteName)
    {
        $this->siteName = $siteName;
    }
    // 例項化本類
    public static function getInstance($siteName='PHP中文網')
    {
        // 判斷當前的靜態屬性是不是當前類的例項,如果不是則建立它
        if(!self::$instance instanceof self){
            self::$instance = new self($siteName);
        }
        return self::$instance;
    }
}
// 工廠模式,生成本類的單一例項
class Factory
{
    public static function create()
    {
        return Site::getInstance('php.cn');
    }
}

// 物件註冊樹

/**
 * Class Register
 * 1. 註冊:set(),將物件掛到樹上
 * 2. 獲取:get(),將物件取下來用
 * 3. 登出:_unset(),將物件吃掉
 */
class Register
{
    // 建立物件池:陣列
    protected static $objects = [];
    // 生成物件並上樹
    public static function set($alias,$object){
        self::$objects[$alias] = $object;
    }
    // 獲取物件
    public static function get($alias){
        return self::$objects[$alias];
    }
    // 銷燬物件
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }
}
// 註冊
Register::set('site',Factory::create());
Register::set('site2',Factory::create());
// 獲取
$obj = Register::get('site1');

var_dump($obj);

echo $obj->siteName;