1. 程式人生 > >C#常用三種設計模式

C#常用三種設計模式

 一、單件模式

動機(Motivation):
    在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。
    如何繞過常規的構造器,提供一種機制來保證一個類只建立一個例項?
這應該是類設計者的責任,而不是類使用者的責任。

      
意圖:
    保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
                                ------<<設計模式>>GOF         
適用性:
   (1)當類只能有一個例項而且客戶可以從一個眾所周知的訪問點訪問它時。
   (2)當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改程式碼就能使用一個擴充套件的例項時。


  程式碼實現
(1)單執行緒Singleton實現

以上程式碼在單執行緒情況下不會出現任何問題。但是在多執行緒的情況下卻不是安全的。
如兩個執行緒同時執行到if (instance ==null)判斷是否被例項化,一個執行緒判斷為True後,在進行建立
 instance =new SingleThread_Singleton();之前,另一個執行緒也判斷(instance ==null),結果也為True.
這樣就
就違背了Singleton模式的原則(保證一個類僅有一個例項)。
怎樣在多執行緒情況下實現Singleton?
(2)多執行緒Singleton實現:

此程式對多執行緒是安全的,使用了一個輔助物件lockHelper,保證只有一個執行緒建立例項(如果instance為空,保證只有一個執行緒instance =new MultiThread_Singleton();建立唯一的一個例項)。

(3)靜態Singleton實現

由此可以看出,完全符合Singleton的原則。
優點: 簡潔,易懂
缺點: 不可以實現帶引數例項的建立。

二、介面卡模式

適配(轉換)的概念無處不在......
適配,即在不改變原有實現的基礎上,將原先不相容的介面轉換為相容的介面。 
動機(Motivate):
    在軟體系統中,由於應用環境的變化,常常需要將“一些現存的物件”放在新的環境中應用,但是新環境要求的介面是這些現存物件所不滿足的。
    那麼如何應對這種“遷移的變化”?如何既能利用現有物件的良好實現,同時又能滿足新的應用環境所要求的介面?這就是本文要說的
Adapter模式。
意圖(Intent):
   
將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
                                                                            -------《設計模式》GOF    
適用性:

    1.系統需要使用現有的類,而此類的介面不符合系統的需要。

    2.想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的介面。

    3.(對物件介面卡而言)在設計裡,需要改變多個已有子類的介面,如果使用類的介面卡模式,就要針對每一個子類做一個介面卡,而這不太實際。
示意性程式碼例項:

Adapter模式的幾個要點:
    Adapter模式主要應用於“希望複用一些現存的類,但是介面又與複用環境要求不一致的情況”,在遺留程式碼複用、類庫遷移等方面非常有用。
    GOF23定義了兩種Adapter模式的實現結構:物件介面卡和類介面卡。但類介面卡採用“多繼承”的實現方式,帶來不良的高耦合,所以一般不推薦使用。物件介面卡採用“物件組合”的方式,更符合鬆耦合精神。
    Adapter模式可以實現的非常靈活,不必拘泥於GOF23中定義的兩種結構。例如,完全可以將Adapter模式中的“現存物件“作為新的介面方法引數,來達到適配的目的。
    Adapter模式本身要求我們儘可能地使用”面向介面的程式設計"風格,這樣才能在後期很方便的適配。
.NET框架中的Adapter應用:
(1)在.Net中複用com物件:
 Com 物件不符合.net物件的介面
使用tlbimp.exe來建立一個Runtime Callable Wrapper(RCW)以使其符合.net物件的介面。
(2).NET資料訪問類(Adapter變體):
各種資料庫並沒有提供DataSet介面
使用DBDataAdapter可以將任何各資料庫訪問/存取適配到一個DataSet物件上。
(3)集合類中對現有物件的排序(Adapter變體);
現有物件未實現IComparable介面
實現一個排序介面卡(繼承IComparer介面),然後在其Compare方法中對兩個物件進行比較。

三、訪問者模式

動機:
    在軟體構建過程中,由於需求的改變,某些類層次結構中常常需要增加新的行為(方法),如果直接在基類中做這樣的更改,將會給子類帶來很繁重的變更負擔,甚至破壞原有設計。
    如何在不更改類層次結構的前提下,在執行時根據需要透明地為類層次結構上的各個類動態新增新的操作,從而避免上述問題?

意圖
    表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這引起元素的新操作。

適用性:
    1.一個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。
    2.需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作"汙染"這些物件的類。Visitor使得你可以將相關的操作集中起來定義在一個類中。當該物件結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
    3.定義物件結構的類很少改變,但經常需要在結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。
程式碼實現

執行結果:
       
Visoitr模式的幾個要點:

    1.Visitor模式通過所謂雙重分發(double dispatch)來實現在不更改Element類層次結構的前提下,在執行時透明地為類層次結構上的各個類動態新增新的操作。
    2.所謂雙重分發卻Visotor模式中間包括了兩個多型分發(注意其中的多型機制);第一個為accept方法的多型辨析;第二個為visitor方法的多型辨析。
    3.Visotor模式的最大缺點在於擴充套件類層次結構(增添新的Element子類),會導致Visitor類的改變。因此Visiotr模式適用"Element"類層次結構穩定,而其中的操作卻經常面臨頻繁改動".

相關推薦

C#常用設計模式

 一、單件模式 動機(Motivation):    在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。    如何繞過常規的構造器,提供一種機制來保證一個類只建立一個例項?這應該是類設計者的責任,而不是類使用

PHP常用設計模式

寫代碼 comment 獲得 return interface 高級 對象 檢測 mys 本文為大家介紹常用的三種php設計模式:單例模式、工廠模式、觀察者模式,有需要的朋友可以參考下。 一、首先來看,單例模式 所謂單例模式,就是確保某個類只有一個實例,而且自行實例化並向整

常用設計模式 PHP代碼

static bsp urn php代碼 ati for val pri single    // 工廠模式 interface Iuser { public function getUserName(); } class UserFactory {

Android常用8設計模式

常用8種設計模式最後三個:介面卡模式、合成模式、訪問者模式    -----文章部落格園整理而來,尊重原創 對於android開發者來說起,介面卡模式簡直太熟悉不過,有很多應用可以說是天天在直接或者間接的用到介面卡模式,比如ListView。 ListView用於顯示列表資

java 常用設計模式示例歸納 | 已打包請帶走

java 設計模式 程序員 程序人生 互聯網 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 GitHub地址DesignPattern 文章說明一個Demo,集合常用的十種設計模式,每個模式使用易被人們接受的案例講述,按模式分

安卓常用6設計模式總結

轉載自https://blog.csdn.net/u012583459/article/details/47079529          和https://blog.csdn.net/u012583459/article/details/470

設計模式(建立型):Java常用23設計模式之單例模式詳解以及Java程式碼實現

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個。 單例模式也是23中設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項一(不使用同步鎖)

設計模式:Java常用23設計模式及六大原則簡介

目錄 簡介 建立型模式 結構型模式 行為型模式 簡介 設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向物件的軟體開發人員所採用。設計模式是軟體開發人員在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體開發人員經

c++/qt 23設計模式

模式分類 23種模式傳送門  命令模式:http://blog.csdn.net/superyang_/article/details/79286046 外觀模式:http://blog.csdn.net/superyang_/article/details/792671

常用設計模式的特點

名稱 特點 工廠模式 用一個工廠方法或者類生成物件,來替換掉在在程式碼中直接new 物件的方式 單例模式 構造方法私有化,通過靜態的公有方法來獲取例項物件

Java設計模式

Java設計模式 1,靜態工廠方法模式 提供一個工廠類,構造方法私有,不允許外界直接建立該工廠類的物件. 在工廠類中新增一個靜態方法,用於建立物件並返回. 缺點:不利於後期維護 如果後期要再建

常用5設計模式介紹

1單例模式 在某些情況下,有些物件只需要一個就可以了,即每個類只需要一個例項。例如,一臺計算機上的可以連線多臺印表機,但是該計算機上的列印程式只能有一個,這裡就可以通過單例模式來避免兩個列印作業同時輸出到印表機中,即在整個的列印過程中只有一個列印程式的例項。 單例模式(單

面試設計模式

1、裝飾模式     *****************************************************************************************

常用設計模式(一)-UML圖和工廠模式

平時在寫程式碼的時候,應該從設計模式的角度去審視自己的程式碼是否合理,下面介紹幾個常用的設計模式 1.先講一下UML基礎知識 一個框代表一個類,分三格:名稱、屬性、介面 +public –private #protected 關聯關係:一個類知道一個類時,用關聯

設計模式工廠模式(JAVA)

bsp ati int abs @override 手機 分配 ron size 一:簡單工廠: 有一個實際工廠,這個工廠只能造一類的產品,這一類產品就是一個產品接口,會有多個具體產品實現這個接口,例 如,一個手機廠,生產蘋果手機,三星手機;

C# 23設計模式

single 責任鏈模式 tor 軟件工程 原型模式 使用 build 設計 簡單 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問

23設計模式介紹()---- 行為型模式

不同 延遲 log 實現 其中 sta IE class 發出 由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章 23種設計模式介紹(一)---- 創建型模式 23種設計模式介紹(二)---- 結構型模式 23

C#設計模式(23設計模式)

mem ML site rate decorator server entry type AC 創建型: 1. 單件模式(Singleton Pattern) 2. 抽象工廠(Abstract Factory) 3. 建造者模式

C# 項目中常用到的設計模式

pos .com size href int wid compare copy wechat 1. 引言 一個項目的通常都是從Demo開始,不斷為項目添加新的功能以及重構,也許剛開始的時候代碼顯得非常淩亂,毫無設計可言。但是隨著項目的叠代,往往需要將很多相同功能的代碼抽取出

8常用的android設計模式

一般來說,常用的android設計模式有以下8種:單例、工廠、觀察者、代理、命令、介面卡、合成、訪問者。     單例模式:目的是為了讓系統中只有一個呼叫物件,缺點是單例使其他程式過分依賴它,而且不同單例執行在不同程序中,使得維護困難;     工廠模式:生產固定