摘要:?jiǎn)卫J侥J较盗械拈_篇,首先介紹的是我最喜歡的單例模式,簡(jiǎn)單而言,這屬于生成一個(gè)且只生成一個(gè)對(duì)象實(shí)例的特殊類。問(wèn)題良好設(shè)計(jì)的系統(tǒng)通過(guò)方法調(diào)用傳遞對(duì)象實(shí)例。面向?qū)ο笤O(shè)計(jì)模式目錄
單例模式
模式系列的開篇,首先介紹的是我最喜歡的單例模式(Singleton),簡(jiǎn)單而言,這屬于:生成一個(gè)、且只生成一個(gè)對(duì)象實(shí)例的特殊類。
這個(gè)唯一存在的類,將替代Global關(guān)鍵字,并且更安全。
產(chǎn)生前提全局變量是OOP程序猿遇到的主要BUG源泉之一,全局變量的沖突也是極其危險(xiǎn)的,因?yàn)镻HP不會(huì)對(duì)其產(chǎn)生任何級(jí)別的錯(cuò)誤,如果結(jié)果不能直接觀測(cè),那么你的程序可能會(huì)讓你感到懵圈。
盡管命名空間的出現(xiàn),一定程度上的避免了全局沖突,然而,在空間內(nèi)的沖突仍然可能存在。可所有的類都可以訪問(wèn)它,全局變量仍是巨大的誘惑。
問(wèn)題良好設(shè)計(jì)的系統(tǒng):通過(guò)方法調(diào)用傳遞對(duì)象實(shí)例。
每個(gè)類都會(huì)與背景環(huán)境保持獨(dú)立,并通過(guò)清晰的通信方式,與系統(tǒng)中其它部分進(jìn)行無(wú)耦合協(xié)作。
但有時(shí),你不得不通過(guò) 中間件 來(lái)溝通各個(gè)組件,中間件會(huì)導(dǎo)致依賴、耦合,并且,倘若組件返回的參數(shù)之一,包含了這個(gè)中間件,將會(huì)導(dǎo)致“依賴污染”。
怎樣的中間件才能避免上述情況呢?
如同Global,它可以被所有對(duì)象使用;
不存儲(chǔ)在全局變量中,不接受覆寫;
它在整個(gè)系統(tǒng)中,是唯一的。
實(shí)現(xiàn)為了解決這個(gè)問(wèn)題,我們可以強(qiáng)行控制“對(duì)象實(shí)例化”,我們通過(guò)簡(jiǎn)單地定義一個(gè)私有構(gòu)造方法,創(chuàng)建一個(gè)無(wú)法從外部實(shí)例化的類,通過(guò)靜態(tài)方法與靜態(tài)屬性,來(lái)間接實(shí)例化它:
class Preferences { private $props = array(); private static $instance; private function __construct() { } public static function getInstance() { if (empty(self::$instance)) { self::$instance = new Preferences(); } return self::$instance; } public function setProperty($key, $val) { $this->props[$key] = $val; } public function getProperty($key) { return $this->props[$key]; } }
單例類創(chuàng)建完畢后,我們進(jìn)行測(cè)試:
// 設(shè)置屬性 $pref = Preferences::getInstance(); $pref->setProperty("name", "UiTest"); unset($pref); // 調(diào)用屬性 $pref2 = Preferences::getInstance(); echo $pref2->getProperty("name");
最終可以得到輸出:UiTest,并且,你可以去設(shè)置任何值,來(lái)測(cè)試它的可用性。
最后附贈(zèng)一張UML圖:
(感謝云繪圖軟件:ProcessOn)
總結(jié)Bad Result:?jiǎn)卫c全局變量都會(huì):創(chuàng)建難以調(diào)試的依賴關(guān)系、被誤用、繞過(guò)安全的通信接口,所以,需要謹(jǐn)慎小心的部署單例類。
Nice Result:與全局變量不同,單例的任何錯(cuò)誤與沖突,都將以報(bào)錯(cuò)的形式出現(xiàn)(除非你關(guān)閉了錯(cuò)誤提示),這下,你就可以放心的使用它了。
(面向?qū)ο笤O(shè)計(jì)模式 - 目錄)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22515.html
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:原型模式平行的繼承層次使用工廠模式在大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。上文中,稱之為特殊的耦合在這里我們介紹一種其抽象工廠模式的變體原型模式。面向?qū)ο笤O(shè)計(jì)模式目錄 原型模式 平行的繼承層次使用工廠模式在:大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。(上文中,稱之為特殊的耦合) 在這里我們介紹一種其抽象工廠模式的變體:原型模式。它使用clone關(guān)鍵詞,來(lái)復(fù)制具體產(chǎn)品類,使得具體產(chǎn)品類能完成自我...
摘要:最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。不過(guò)因?yàn)椴恢С侄嗑€程所以不需要考慮這個(gè)問(wèn)題了。 最近開展了三次設(shè)計(jì)模式的公開課,現(xiàn)在來(lái)總結(jié)一下設(shè)計(jì)模式在PHP中的應(yīng)用,這是第一篇?jiǎng)?chuàng)建型模式之單例模式。 一、設(shè)計(jì)模式簡(jiǎn)介 首先我們來(lái)認(rèn)識(shí)一下什么是設(shè)計(jì)模式: 設(shè)計(jì)模式是一套被反復(fù)使用、容易被他人理解的、可靠的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。 設(shè)計(jì)模式不...
摘要:系列目錄生成對(duì)象的模式面向?qū)ο蟮闹J絾卫嫦驅(qū)ο蟮闹J焦S方法面向?qū)ο蟮闹J匠橄蠊S方法面向?qū)ο蟮闹J皆徒M合類對(duì)象的模式面向?qū)ο蟮闹J浇M合更新裝飾模式 系列目錄 生成對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式:?jiǎn)卫?【面向?qū)ο蟮腜HP】之模式:工廠方法 【面向?qū)ο蟮腜HP】之模式:抽象工廠方法 【面向?qū)ο蟮腜HP】之模式:原型 組合類/對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式...
閱讀 2520·2021-09-26 10:18
閱讀 3397·2021-09-22 10:02
閱讀 3196·2019-08-30 15:44
閱讀 3333·2019-08-30 15:44
閱讀 1838·2019-08-29 15:25
閱讀 2581·2019-08-26 14:04
閱讀 2047·2019-08-26 12:15
閱讀 2446·2019-08-26 11:43