摘要:單例模式模式系列的開篇,首先介紹的是我最喜歡的單例模式,簡單而言,這屬于生成一個且只生成一個對象實例的特殊類。問題良好設計的系統通過方法調用傳遞對象實例。面向對象設計模式目錄
單例模式
模式系列的開篇,首先介紹的是我最喜歡的單例模式(Singleton),簡單而言,這屬于:生成一個、且只生成一個對象實例的特殊類。
這個唯一存在的類,將替代Global關鍵字,并且更安全。
產生前提全局變量是OOP程序猿遇到的主要BUG源泉之一,全局變量的沖突也是極其危險的,因為PHP不會對其產生任何級別的錯誤,如果結果不能直接觀測,那么你的程序可能會讓你感到懵圈。
盡管命名空間的出現,一定程度上的避免了全局沖突,然而,在空間內的沖突仍然可能存在。可所有的類都可以訪問它,全局變量仍是巨大的誘惑。
問題良好設計的系統:通過方法調用傳遞對象實例。
每個類都會與背景環境保持獨立,并通過清晰的通信方式,與系統中其它部分進行無耦合協作。
但有時,你不得不通過 中間件 來溝通各個組件,中間件會導致依賴、耦合,并且,倘若組件返回的參數之一,包含了這個中間件,將會導致“依賴污染”。
怎樣的中間件才能避免上述情況呢?
如同Global,它可以被所有對象使用;
不存儲在全局變量中,不接受覆寫;
它在整個系統中,是唯一的。
實現為了解決這個問題,我們可以強行控制“對象實例化”,我們通過簡單地定義一個私有構造方法,創建一個無法從外部實例化的類,通過靜態方法與靜態屬性,來間接實例化它:
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]; } }
單例類創建完畢后,我們進行測試:
// 設置屬性 $pref = Preferences::getInstance(); $pref->setProperty("name", "UiTest"); unset($pref); // 調用屬性 $pref2 = Preferences::getInstance(); echo $pref2->getProperty("name");
最終可以得到輸出:UiTest,并且,你可以去設置任何值,來測試它的可用性。
最后附贈一張UML圖:
(感謝云繪圖軟件:ProcessOn)
總結Bad Result:單例與全局變量都會:創建難以調試的依賴關系、被誤用、繞過安全的通信接口,所以,需要謹慎小心的部署單例類。
Nice Result:與全局變量不同,單例的任何錯誤與沖突,都將以報錯的形式出現(除非你關閉了錯誤提示),這下,你就可以放心的使用它了。
(面向對象設計模式 - 目錄)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22515.html
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
摘要:原型模式平行的繼承層次使用工廠模式在大型設計中,必須去維護大量的產品類。上文中,稱之為特殊的耦合在這里我們介紹一種其抽象工廠模式的變體原型模式。面向對象設計模式目錄 原型模式 平行的繼承層次使用工廠模式在:大型設計中,必須去維護大量的產品類。(上文中,稱之為特殊的耦合) 在這里我們介紹一種其抽象工廠模式的變體:原型模式。它使用clone關鍵詞,來復制具體產品類,使得具體產品類能完成自我...
摘要:最近開展了三次設計模式的公開課,現在來總結一下設計模式在中的應用,這是第一篇創建型模式之單例模式。不過因為不支持多線程所以不需要考慮這個問題了。 最近開展了三次設計模式的公開課,現在來總結一下設計模式在PHP中的應用,這是第一篇創建型模式之單例模式。 一、設計模式簡介 首先我們來認識一下什么是設計模式: 設計模式是一套被反復使用、容易被他人理解的、可靠的代碼設計經驗的總結。 設計模式不...
摘要:系列目錄生成對象的模式面向對象的之模式單例面向對象的之模式工廠方法面向對象的之模式抽象工廠方法面向對象的之模式原型組合類對象的模式面向對象的之模式組合更新裝飾模式 系列目錄 生成對象的模式 【面向對象的PHP】之模式:單例 【面向對象的PHP】之模式:工廠方法 【面向對象的PHP】之模式:抽象工廠方法 【面向對象的PHP】之模式:原型 組合類/對象的模式 【面向對象的PHP】之模式...
閱讀 2511·2021-09-26 10:18
閱讀 3386·2021-09-22 10:02
閱讀 3183·2019-08-30 15:44
閱讀 3326·2019-08-30 15:44
閱讀 1831·2019-08-29 15:25
閱讀 2572·2019-08-26 14:04
閱讀 2035·2019-08-26 12:15
閱讀 2437·2019-08-26 11:43