PHP設計模式之-----單利模式

<?php
//在所有模式設計中,有三種基礎設計模式,單例模式,工廠模式,註冊樹模式,其他模式往往基於這幾種模式,今天帶來的是單例模式。
//http://www.cnblogs.com/DeanChopper/p/4761253.html
class Single{
	public $hash;
	static protected $ins=null;
	final protected function __construct(){
		$this->hash = rand(1,9999);
	}
	static public function getInstance(){
		if(self::$ins instanceof self){
			return self::$ins;
		}
		self::$ins = new self();
		return self::$ins;
	}
}
$a = Single::getInstance();
echo $a->hash;
echo '<br>';
$aa = Single::getInstance();
echo $aa->hash;


/*
單例設計模式 (單態)
    定義: 一個類 只能允許有 一個對象存在.
    1.不讓進: 使類不能被實例化
    2.留後門: 設置靜態方法
    3.給對象: 在靜態方法裏實例化該類
    4.判初夜: 判斷是否是 第一次產生該類的對象
    5.設靜態: 靜態方法裏 要使用靜態屬性
 */

/*//1.不讓進: 使類不能被實例化-----------------*/
class Test
{
    // 設置 一個封裝的構造方法
    private function __construct()
    {
        //佔位, 我就是不讓你NEW我~~~
    }
}

/*//2.留後門: 設置靜態方法--------------------*/
class Test
{
    // 設置 一個封裝的構造方法
    private function __construct()
    {
        //佔位, 我就是不讓你NEW我~~~
    }
    //後門
    public static function getObject()
    {
        echo "啊,我是後門,進吧!<br>";
    }
}

/*//3.給對象: 在靜態方法裏實例化該類------------------*/
class Test
{
    // 設置 一個封裝的構造方法
    private function __construct()
    {
        //佔位, 我就是不讓你NEW我~~~
    }
    //後門
    public static function getObject()
    {
        echo "啊,我是後門,進吧!<br>";
        return new self();//實例化一個對象給你
    }
}

/*//4.判初夜: 判斷是否是 第一次產生該類的對象------------------*/
class Test
{
    private $obj = null;//屬性值爲對象,默認爲null
    // 設置 一個封裝的構造方法
    private function __construct()
    {
        //佔位, 我就是不讓你NEW我~~~
    }
    //後門
    public static function getObject()
    {
        echo "啊,我是後門,進吧!<br>";
        if ($this->obj === null) {
            $this->obj = new self();//實例化一個對象
        }
        //返回的屬性 其實就是本對象
        return $this->obj;
    }
}

//5.設靜態: 靜態方法裏 要使用靜態屬性------------------
class Test
{
	private static $obj = null;//屬性值爲對象,默認爲null
	// 設置 一個封裝的構造方法
	private function __construct()
	{
		//佔位, 我就是不讓你NEW我~~~
	}
	//後門
	public static function getObject()
	{
		echo "啊,我是後門,進吧!<br>";
		if (self::$obj === null) {
			self::$obj = new self();//實例化一個對象
		}
		//返回的屬性 其實就是本對象
		return self::$obj;
	}
}

/*Test::getObject();//使用靜態方法訪問該類裏的方法
exit;*/

$t1 = Test::getObject();
$t2 = Test::getObject();
$t3 = Test::getObject();
$t4 = Test::getObject();
$t5 = Test::getObject();
$t6 = Test::getObject();
$t7 = Test::getObject();
$t8 = Test::getObject();

//判斷 兩個對象 是否是同一個對象
if ($t1 === $t6) {
	echo "哦, Yes! 是同一個實例<br>";
} else {
	echo "哦, No! 不是同一個實例<br>";
}

//第五步是成品,前面4步都是一步一步的推的!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章