<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>色胚子部落 &#187; 翻譯</title>
	<atom:link href="http://blog.colorbase.tw/tag/%e7%bf%bb%e8%ad%af/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.colorbase.tw</link>
	<description>訊息多變的時代裡，需要多學習多思考</description>
	<lastBuildDate>Mon, 15 Aug 2011 03:29:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[翻譯]如何使用單例設計模式(Singleton design pattern) for PHP</title>
		<link>http://blog.colorbase.tw/programming/625</link>
		<comments>http://blog.colorbase.tw/programming/625#comments</comments>
		<pubDate>Sun, 06 Sep 2009 07:48:16 +0000</pubDate>
		<dc:creator>阿育</dc:creator>
				<category><![CDATA[程式設計]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[翻譯]]></category>
		<category><![CDATA[設計模式]]></category>

		<guid isPermaLink="false">http://blog.colorbase.tw/?p=625</guid>
		<description><![CDATA[今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「How to use the Singleton design pattern」。
該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。

How to use the Singleton design pattern
作者：Karl
出處：How to use the Singleton design pattern
翻譯：阿育
單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。
思考一下以下的類別(Class)：


class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
   ...]]></description>
			<content:encoded><![CDATA[<p>今天在找單例設計模式(Singleton design pattern)或稱單例模式(Singleton Pattern)的名詞解釋資料時，找到了一篇「<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a>」。</p>
<p>該作者使用簡短的描述、簡潔的範例，清楚的闡明單例設計模式的概念與使用方式，我覺得這篇文章很容易懂，很值得參考，因此將其翻譯成中文，由於我的英文能力不好，翻譯上若有謬誤的地方，還請多多指教。</p>
<p><span id="more-625"></span></p>
<h2><span style="color: #008080;">How to use the Singleton design pattern</span></h2>
<p>作者：<a href="http://www.talkphp.com/members/karl.html" target="_blank">Karl</a></p>
<p>出處：<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">How to use the Singleton design pattern</a><a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank"></a></p>
<p>翻譯：<a href="http://blog.colorbase.tw/about" target="_blank">阿育</a></p>
<p>單例模式(Singleton Pattern)是四人幫(GoF,Gang of Four)設計模式之一。這個模式提供了一個將物件實例(instances)限制為單一實例的方法。若你過去曾使用過陌生的語法，這是一個很容易掌握的設計模式。</p>
<p>思考一下以下的類別(Class)：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    public function __construct() { ... }
    public function connect() { ... }
    public function query() { ... }
    ...
}
</pre>
</div>
<p>每當我們需要一個連線時，這個類別建立了一個資料庫連線的類別實例，例如：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>假設我們在一個腳本的生命週使用上面的方法許多次，每當我們建立一個實例，也建立了一個新的資料庫物件（我們還建立了一個新的資料庫連線，但是以這個例子來說，這是沒必要的），同時也將耗費更多記憶體。</p>
<p>有時您可能想刻意建立多個類別實例，但在這裡我們不這麼做。</p>
<p>單例模式提供的方法便是去解決這個常見的問題。為了讓資料庫類別單一實例化，我們首先需要為這個類別添加一個新的屬性，我們將其命名為$m_pInstance：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    ...
}
</pre>
</div>
<p>此屬性將被用來存儲資料庫類別的單一實例。需注意，這個屬性必須是靜態(static)的。</p>
<p>接下來，我們需要將構造函數(constructor或稱建構函數、建構子)的存取範圍改為私有(private)。這是經常混淆視聽的陌生語法。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }
}
</pre>
</div>
<p>透過使用私有的構造函數，我們已經禁止了外部將類別實例化。因此如下面的程式碼將不可以被執行於類別之外。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
</pre>
</div>
<p>為了建立單例模式，我們現在需要增加一個方法。增加下面的方法到資料庫類別中：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
public static function getInstance()
{
    if (!self::$m_pInstance)
    {
        self::$m_pInstance = new Database();
    }

    return self::$m_pInstance;
}
</pre>
</div>
<p>這個看起來有趣的方法，它的責任是處理物件類別實例。請核對我們的靜態屬性$ m_pInstance，相對於此基本上這就容易理解了，如果建立資料庫物件透過呼叫建構函數，這是不合法的。請記住，我們已經讓__construct()方法成為私有的，所以物件實例的建立只能透過物件的方法。</p>
<p>這個方法函數最終將傳回一個靜態屬性的參照(reference)。在隨後呼叫了getInstance()將會回傳一個有效的$ m_pInstance參照，不會有新的物件實例被建立。</p>
<p>所以，我們的資料庫類別看起來差不多像這樣：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
class Database
{
    // Store the single instance of Database
    private static $m_pInstance;

    private function __construct() { ... }

    public static function getInstance()
    {
        if (!self::$m_pInstance)
        {
            self::$m_pInstance = new Database();
        }

        return self::$m_pInstance;
    }
}
</pre>
</div>
<p>現在你可以在專案中的任何地方使用資料庫類別實例（不使用全域變數或函數的參數）。</p>
<p>(譯按：當然，你必須Include這個class啦 XD)</p>
<p>下面是範例與比較：</p>
<p>我們通常使用這種的方式建立物件：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = new Database();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>這則是單例模式所使用的方式：</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e7260e77-5e65-4ebc-af8d-01c0054aa9ca" class="wlWriterEditableSmartContent">
<pre name="code" class="php:nogutter">
$pDatabase = Database::getInstance();
$aResult = $pDatabase->query('...');
</pre>
</div>
<p>結論，單例模式是一種易於使用的設計模式，它限制了類別實例的數量。</p>
<p>範例檔詳見<a href="http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html" target="_blank">原文</a>的附加檔案。</p>
<h3><span style="color: #008080;">翻譯後記</span></h3>
<p>如同作者所提，單例設計模式是一種很容易理解且容易使用的一種設計模式，目的在於確保一個類別只有一個實例，並提供對該實例的全域存取。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.colorbase.tw/programming/625/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

