設計模式三大基礎模式之工廠模式,單例模式,註冊樹模式

工廠模式:

1.簡單工廠模式

  1. 主要角色:抽象類、實現類、工廠類
  2. 具體實現 專門定義一個類來負責創建其它類的實例,被創建的實例通常都具有共同的父類。

    abstract class Transportation {
    protected $name;
    public function moveWay(){
    }
    }
    class Car extends Transportation{
    protected $name="汽車";
    public function moveWay(){
        return $this->name."_滾動";
    }
    }
    class Aircraft extends  Transportation{
    protected $name="飛機";
    public function moveWay(){
        return  $this->name."_飛行";
    }
    }
    class Factorry{
    public static function createTran($id){
        switch ($id)
        {
            case 1:
              return new Car();
                break;
            case 2:
                return new Aircraft();
                break;
            default:
                return "input error";
        }
    }
    }
    echo Factorry::createTran(2)->moveWay();

    單例模式

    在一個項目中保持一個對象只存在一個實例,全局調用便利。例如:數據庫操作對象、日誌寫入對象、全局配置解析對象等

    <?php
    /**
    * Created by 馬廷廣
    * User: 馬廷廣
    * Date: 2015/7/30
    * Time: 15:50
    */
    class singleton {
    private static $instance//私有的靜態變量來存儲產生的對象實例
    /*
    *構造方法,注意必須也是私有的,不允許被外部實例化(即在外部被new)
    */
    private function __construct(){//
          echo __CLASS__."生成";
    }
    /*
    *重載__clone方法,不允許對象實例被克隆
    */
     public function __clone(){
        throw new Exception("Singleton Class Can Not Be Cloned");
    }
    /*
    *類唯一實例的全局訪問點,用於判斷並返回對象實例,供外部調用
    */
    public static function getInstance(){
        if(!self::$instance){
          self::$instance=new self();
        }
        return self::$instance;
    }
    /*
    *具體的業務方法,實際可以有很多方法,示例簡略
    */
    public function hello(){
        echo "Hello World";
    }
    }
    $sin=singleton::getInstance();
    $sin->hello();//輸出:singleton生成 Hello World
    

    註冊樹模式

    註冊模式就是將一些對象註冊到全局樹上面,那麼可以被任何地方直接訪問

    <?php
    /**
    * Created by 馬廷廣
    * User: 馬廷廣
    * Date: 2015/7/30
    * Time: 16:16
    */
    class Register{
    protected static $objects;
    //將一個對象註冊到全局的註冊樹上
    static function _set($alias, $object){ //$alias:映射的名字
        //當調用set方法時,將對象映射到註冊樹上
        self::$objects[$alias] = $object;
    }
    
    //得到全局樹上的對象
    static function get($name){
        return self::$objects[$name];
    }
    
    function _unset($alias){
        //調用unset方法時,表示把對象從樹上移除
        unset(self::$objects[$alias]);
    }
    }
    class Aircraft {
    protected $name="飛機";
    public function moveWay(){
        return  $this->name."_飛行";
    }
$aircraft=new Aircraft();//註冊樹模式的調用方法
Register::_set("aircraft",$aircraft);
echo Register::get("aircraft");
發佈了40 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章