幾種常用的設計模式介紹


構造器(Constructor)模式

實際上就是我們通常使用的一種最基本的類,其構造器帶有參數。

比如:

function Car( model, year, miles ) {

 this.model = model; this.year = year; this.miles = miles; this.toString = function () { return this.model + " has done " + this.miles + " miles"; }; }  var civic = new Car( "Honda Civic", 2009, 20000 ); var mondeo = new Car( "Ford Mondeo", 2010, 5000 ); 
模塊(Module)模式

模塊模式是為類提供私有變量和特權方法(有權訪問私有變量和私有函數的公有方法)的方法。在JavaScript,就可通過閉包的方式,模擬實現模塊模式。

對象字面量:

復制代碼
var myModule = { variableKey: variableValue, getKey: function () { // ...  } };
復制代碼
嚴格上講,對象字面量實現的只是不完整的模塊模式,因為無法達到變量、方法私有效果。不過確實有分離和組織代碼的能力,也就算一種簡略的模塊模式的實現方式

簡單例子:

復制代碼
var myModule = (function(){ var privateVar = 10; return { getPrivateVar : function(){ return privateVar; } } })();

 

 

揭示(Revealling)模塊模式

 

這種是模塊模式的改進版本,它是在模塊代碼底部,定義所有對外公布的函數(僅是指針)和變量。

 

復制代碼
var myRevealingModule = (function () { var privateVar = "Ben Cherry", publicVar = "Hey there!"; function privateFunction() { console.log( "Name:" + privateVar ); } function publicSetName( strName ) { privateVar = strName; } function publicGetName() { privateFunction(); } // Reveal public pointers to // private functions and properties return { setName: publicSetName, greeting: publicVar, getName: publicGetName };   })();
復制代碼

 

這種模式我經常使用,它很容易指出哪些函數和變量可以被公開訪問,增強了可讀性。

 

單例(Singleton)模式

單例模式它限制了類的實例化次數只能一次。在實例不存在的情況下,可以通過一個方法創建一個類來實現創建類的新實例;如果實例已經存在,它會簡單返回該對象的引用。

它擁有一個私有構造函數,這確保用戶無法通過new直接實例它。除此之外,該模式中包含一個靜態私有成員變量instance與靜態公有方法Instance()。Instance()方法負責檢驗並實例化自己,然后存儲在靜態成員變量中,以確保只有一個實例被創建。比如下面的例子代碼(若屬於多線程環境,需要考慮線程之間的同步):

/// <summary>
/// A simple singleton class implements. /// </summary> public sealed class Singleton { private static Singleton _instance = null; /// <summary> /// Prevents a default instance of the /// <see cref="Singleton"/> class from being created. /// </summary> private Singleton() { } /// <summary> /// Gets the instance. /// </summary> public static Singleton Instance { get { return _instance ?? (_instance = new Singleton()); } } }

工廠(Factory)模式

工廠模式提供一個通用的接口來創建對象。通常還可以細分為:簡單工廠工廠方法抽象工廠模式。

簡單工廠模式,就是將一些有共同點的對象,通過一個工廠來進行統一的方法來創建。這類模式通常是對對象的方法進行抽象,並在工廠類中調用各自類的構造方法,后續使用對象的抽象方法來調用實際對象的接口。個人覺得簡單工廠模式跟構造模式有一些相似之處。

 

 工廠方法模式:可以看着是在簡單工廠模式的基礎上,增加一次對工廠的抽象,在實際的使用中,我們通過具體的工廠類來創建相應的對象。

抽象工廠模式:更加復雜的一種模式, 有抽象工廠、抽象對象,抽象工廠中有創建不同抽象對象的方法。即在工廠方法的基礎上,為抽象工廠增加創建不同對象的接口而形成的一種代碼組織。

 

 

這三種工廠模式一個比一個復雜,在實際使用時需要掂量一下,繼續引用參考意見:

簡單工廠模式最大的缺點是違背了“開閉原則”,當增加了新的產品時,需要去修改簡單工廠類的結構。工廠方法模式主要是針對單一產品結構的情景,而抽象工廠模式是針對多級產品結構的場景。

 

OO的一些原則
 1.OCP(開閉原則,Open-Closed Principle):一個軟件的實體應當對擴展開放,對修改關閉。也就是說,對於一個已有的軟件,如果需要擴展,應當在不需修改
     已有代碼的基礎上進行。
  2.DIP(依賴倒轉原則,Dependence Inversion Principle):要針對接口編程,不要針對實現編程。簡單點說,對於不同層次的編程,高層次暴露給低層次
     的應當只是接口,而不是它的具體類。
  3.LoD(迪米特法則,Law of Demeter):只與你直接的朋友通信,而避免和陌生人通信。

 

可參見:https://wenku.baidu.com/view/60c6ca21192e45361066f5e0.html

 

中介者(Mediator)模式定義

中介者作為一種行為設計模式,它公開一個統一的接口,系統的不同對象或組件可以通過該接口進行通信。增加一個中介者對象后,所有的相關對象通過中介者對象來通信,而不是互相引用,所以當一個對象發生改變時,只需要通知中介者對象即可。

 

中介者模式與觀察者模式差異

1. 調度中心不同。

中介者模式調度是由中介者,而觀察者模式調度的是觀察者;

中介者模式與訂閱/發布模式的調度方式更像,都是獨立一個集中的調度中心。

2. 中介者模式參與了對象行為的實現(例如上面示例的飛機起飛),而觀察者模式並不參與,僅做目標通知。

中介者模式與訂閱/發布模式差異

1. 中介者模式與業務相關,訂閱/發布模式與業務無關。(這是我覺得最大差別)

雖然實現結構非常相像,但是很明顯的是,中介者模式參與業務相關東西,所以內容是大相徑庭的。

2. 兩個模式都有集中調度效果,對象之間不直接參與通信。

 

原型(prototype)模式定義

原型模式(創建型設計模式)是用一個對象做模板,克隆出新對象。

另外原型模式中的克隆分為"淺克隆"和"深克隆":

淺克隆: 對值類型的成員變量進行值的復制,對引用類型的成員變量只復制引用,不復制引用的對象。

深克隆: 對值類型的成員變量進行值的復制,對引用類型的成員變量也進行引用對象的復制。

 

裝飾者(Decorator)模式
定義:
給對象動態添加額外的功能。向基本對象添加(裝飾)屬性或方法,而不是進行子類化,它較為精簡。
使用場景:
java IO 流是典型的裝飾模式。
 

 

......

 

http://www.cnblogs.com/lovesong/category/839413.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM