西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → 系統(tǒng)架構(gòu)技能之設(shè)計(jì)模式-單件模式

系統(tǒng)架構(gòu)技能之設(shè)計(jì)模式-單件模式

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/10/3 19:08:52字體大小:A-A+

作者:佚名點(diǎn)擊:85次評(píng)論:0次標(biāo)簽: 架構(gòu)

  • 類(lèi)型:電子教程大。23.1M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

1、開(kāi)篇

       其實(shí)咱本來(lái)不是籌劃把體系架構(gòu)中的1些計(jì)劃模式單獨(dú)抽出來(lái)講授的,因?yàn)樵S多的好朋友也比力關(guān)注這方面的內(nèi)容,以是咱想議決咱明白及通常項(xiàng)目中應(yīng)用到的1

些常見(jiàn)的計(jì)劃模式,拿出來(lái)給各人做個(gè)簡(jiǎn)略講授,咱這里只是拋磚引玉,要是某個(gè)地方講授的不精確大概不細(xì)致,請(qǐng)各品德評(píng)指出。園子內(nèi)里的許多的大牛寫(xiě)的計(jì)劃模式

都特別的經(jīng)典,咱這里寫(xiě)大概有點(diǎn)布鼓雷門(mén)的以為,不外咱還是決定把它寫(xiě)出來(lái),盼望能對(duì)初學(xué)者有肯定的資助與引導(dǎo)的作用。即使咱這里要是講某個(gè)地方表明的有問(wèn)

題大概講是某個(gè)地方寫(xiě)的不切合邏輯之處,還請(qǐng)各人多多指出,提著名貴意見(jiàn)。

       軟件項(xiàng)目中其實(shí)有許多總結(jié)性的話語(yǔ),好比講軟件=算法 數(shù)據(jù)布局等等這樣的形貌,即使咱們這里大概算法便是泛指1些軟件中的編程要領(lǐng)了,計(jì)劃模式如何去

明白呢?為什么要有計(jì)劃模式?它能帶來(lái)什么?等等這些都是咱們必要討論的問(wèn)題。首先咱們必要了解計(jì)劃模式能帶來(lái)什么。大概這才是咱們學(xué)習(xí)它的緊張緣故原由,要是

講不能為咱們?cè)谥`寫(xiě)軟件的進(jìn)程中帶來(lái)更方面的利益,那咱們也不會(huì)利用與學(xué)習(xí)它。

       計(jì)劃模式是什么?

       計(jì)劃模式能簡(jiǎn)略的明白為辦理某1系列問(wèn)題的完善的辦理方案。咱們?cè)谲浖_(kāi)辟的進(jìn)程中每每遇到計(jì)劃成果實(shí)現(xiàn)的問(wèn)題,而計(jì)劃模式正是為相識(shí)決軟件計(jì)劃成果

實(shí)現(xiàn)時(shí)遇到的某1類(lèi)問(wèn)題的辦理方案。因?yàn)?樣平常環(huán)境下來(lái)講,咱們?cè)谀硞(gè)軟件成果的開(kāi)辟進(jìn)程中遇到的成果計(jì)劃問(wèn)題,大概是古人很早就遇到過(guò)的問(wèn)題,以是議決這種

計(jì)劃模式的要領(lǐng)來(lái)辦理,能讓咱們?cè)谲浖䦟?shí)現(xiàn)的進(jìn)程中少走彎路,大概講是給咱們的軟件計(jì)劃帶來(lái)很好的機(jī)動(dòng)性與順應(yīng)性。

       計(jì)劃模式帶來(lái)了什么?

       計(jì)劃模式是源于實(shí)踐,并且每種計(jì)劃模式都包羅了1個(gè)問(wèn)題形貌,問(wèn)題涉及到的加入者并且提供了1個(gè)實(shí)際的辦理方案。計(jì)劃模式的利益咱們能議決下圖來(lái)簡(jiǎn)略

闡明:

       image 即使咱這里大概總結(jié)還不完全,還請(qǐng)各人增補(bǔ),咱會(huì)加載這內(nèi)里的內(nèi)容。即使設(shè)

計(jì)模式帶來(lái)了這么多的利益,以是咱們學(xué)習(xí)計(jì)劃模式就顯得比力須要了,也是從事軟件開(kāi)辟及計(jì)劃必需掌控的根本技能之1。

       計(jì)劃模式的簡(jiǎn)略分類(lèi):

       image 即使這里能簡(jiǎn)略的分為這3大類(lèi),下面咱們?cè)趫?bào)告的進(jìn)程中將會(huì)分別講授,即使咱這里所以創(chuàng)建型模

式開(kāi)始講授,咱想創(chuàng)建型模式也是各人項(xiàng)目中必備的吧?下面咱就從創(chuàng)建型模式先來(lái)講授。

2、擇要

       本文將緊張講授創(chuàng)建型模式中的單例模式先來(lái)講授,因?yàn)閱卫J绞亲詈?jiǎn)略也是最容易明白的計(jì)劃模式,上手快,易利用的計(jì)劃模式。本文將從下面的流程來(lái)講授

單例模式,背面報(bào)告的計(jì)劃模式也將利用這樣的要領(lǐng)。

       1、什么是單例模式?

       2、單例模式的應(yīng)用場(chǎng)景。

       3、舉例闡明單例模式的利用。

       4、總結(jié)單例模式的用法。

3、本文大綱

       a、開(kāi)篇。

       b、擇要。

       c、本文大綱。

       d、單例模式的劇情。

       e、相干應(yīng)用場(chǎng)景分析。

       f、本文總結(jié)。

       g、系列進(jìn)度。

       h、下篇預(yù)告。

4、單例模式的劇情

       本章咱們將來(lái)報(bào)告下單例模式的利用,首先咱們來(lái)看看單例模式的定義:

       單例模式:是1種軟件計(jì)劃中經(jīng)常使用的計(jì)劃模式,緊張是用來(lái)控制某個(gè)類(lèi)必需在某個(gè)應(yīng)用步調(diào)中只能有1個(gè)實(shí)例存在。

       偶然候咱們必要確保整個(gè)體系中只有某個(gè)類(lèi)的1個(gè)實(shí)例存在,這樣有利于咱們與諧控制體系的舉動(dòng)。比方:咱們?cè)谀硞(gè)體系中利用了發(fā)送短信的這樣的辦事,那么

咱們大概盼望議決單1的短信辦事類(lèi)的實(shí)例,而不是多個(gè)東西實(shí)例完成短信的發(fā)送辦事。此時(shí)咱們能議決單例模式來(lái)完成。

       image 上圖簡(jiǎn)略形貌了單例模式應(yīng)用的位置。

        咱們看看單例模式的幾種實(shí)現(xiàn)要領(lǐng):

        image

        下面咱們來(lái)舉例闡明下這2種要領(lǐng)的實(shí)現(xiàn)。

        1、外部控制的要領(lǐng)

 

view source
print?
01 public class Instance 
02
03     private List<SendMessage> lists = new List<SendMessage>(); 
04     private SendMessage sendInstance; 
05  
06     public SendMessage SInstance 
07     { 
08         get 
09         { 
10             return sendInstance; 
11         } 
12     } 
13  
14     public void InstanceMethod() 
15     { 
16         if (lists.Count == 0) 
17         { 
18             sendInstance = new SendMessage(); 
19             lists.Add(sendInstance); 
20         } 
21         else 
22         { 
23             sendInstance = lists[0]; 
24         } 
25     } 
26 }

       2、內(nèi)部控制要領(lǐng)

 

view source
print?
01 public class Instance1 
02  { 
03     private static SendMessage sendInstance; 
04     private static object _lock = new object(); 
05  
06     protected Instance1() 
07     { 
08     } 
09  
10     public static SendMessage SInstance 
11     { 
12         get 
13         { 
14             lock (_lock) 
15             { 
16                 if (sendInstance == null) 
17                     sendInstance = new SendMessage(); 
18                 return sendInstance; 
19             } 
20         } 
21     } 
22 }

        這里有幾點(diǎn)必要過(guò)細(xì)的地方,對(duì)付第2種要領(lǐng)有幾個(gè)地方必要闡明下,首先是要控制全局只有1個(gè)實(shí)例的類(lèi),請(qǐng)定義成靜態(tài)實(shí)例,如允許以確保只有1個(gè)實(shí)例對(duì)

象,其次,這個(gè)東西的布局函數(shù)請(qǐng)聲明成掩護(hù)范例的成員,如允許以屏蔽議決直接實(shí)例化的情勢(shì)來(lái)訪問(wèn)。議決這樣的情勢(shì),客戶能不必要了解某個(gè)單例實(shí)例東西的內(nèi)

部實(shí)現(xiàn)細(xì)節(jié)。1樣平常環(huán)境下饜足上面的2點(diǎn)需要就能完成全局唯1訪問(wèn)入口的控制。即使大概在多線程的環(huán)境下接納這樣的情勢(shì)還會(huì)有肯定的毛病,即使咱們這里也簡(jiǎn)略

的講授下相應(yīng)的控制方案。方案如下:

           

view source
print?
1 public class CoolInstance 
2
3     private CoolInstance() 
4     { 
5     } 
6     public static readonly CoolInstance Instance = new CoolInstance(); 
7 }
    

       看吧很簡(jiǎn)略吧,即使咱們這里來(lái)簡(jiǎn)略表明下原理:

       1、咱們先把布局函數(shù)聲明為私有的布局函數(shù),這樣咱們能大概屏蔽外部議決實(shí)例化的情勢(shì)訪問(wèn)內(nèi)部的成員函數(shù)。全部的成員函數(shù)的訪問(wèn)必需議決靜態(tài)成員Instance

來(lái)完成訪問(wèn)。

       2、這段代碼議決定義大眾、靜態(tài)、只讀的成員相當(dāng)于在類(lèi)被第1次利用時(shí)實(shí)行布局,因?yàn)槭侵蛔x的,以是1旦布局后不容許修正,就不用擔(dān)心不寧?kù)o的問(wèn)題。

        信賴對(duì)上面的介紹各人應(yīng)該根本上了解單例模式的應(yīng)用了,那么下面咱們來(lái)看看項(xiàng)目中的實(shí)際應(yīng)用場(chǎng)景及用法。

5、相干應(yīng)用場(chǎng)景講授

        1、場(chǎng)景短信及郵件發(fā)送辦事

        那么咱們將接納上面介紹的最“COOL”的要領(lǐng)來(lái)舉行控制,提供發(fā)送短信及發(fā)送郵件的辦事。

 

view source
print?
01 public class CoolInstance 
02
03     private CoolInstance() 
04     { 
05     } 
06  
07     public static readonly CoolInstance Instance = new CoolInstance(); 
08  
09     /// <summary> 
10     /// 發(fā)送手機(jī)短信 
11     /// </summary> 
12     public bool SendMessage(string telNumber,string content) 
13     { 
14         return true; 
15     } 
16  
17     /// <summary> 
18     /// 發(fā)送郵件 
19     /// </summary> 
20     /// <param name="content"></param> 
21     /// <param name="toMail"></param> 
22     public bool SendMail(string content,string toMail) 
23     { 
24         return true; 
25     } 
26 }

        咱們?cè)賮?lái)看看調(diào)用類(lèi)中怎樣謄寫(xiě)完成調(diào)用。比方咱們有個(gè)訂單類(lèi),當(dāng)有人新下訂單時(shí),將給賣(mài)家發(fā)送短信提示成果。

         

view source
print?
01 /// <summary> 
02  /// 訂單業(yè)務(wù) 
03 /// </summary> 
04 public class Order 
05
06     public int Save() 
07     { 
08         //先是將訂單的相干資訊生成, 
09         this.InitOrderInfo(); 
10  
11         //實(shí)行訂單的長(zhǎng)期化要領(lǐng) 
12         int count= this.Add(); 
13  
14         //發(fā)送短信 
15         CoolInstance.Instance.SendMessage(string.Empty, string.Empty); 
16         //發(fā)送郵件 
17         CoolInstance.Instance.SendMail(string.Empty, string.Empty); 
18  
19         return count; 
20     } 
21  
22     /// <summary> 
23     /// 初始化訂單資訊 
24     /// </summary> 
25     private void InitOrderInfo() 
26     { 
27     } 
28  
29     /// <summary> 
30     /// 新增訂單資訊 
31     /// </summary> 
32     /// <returns></returns> 
33     private int Add() 
34     { 
35         return 0; 
36     } 
37 }
       

        這樣咱們就完成了短信發(fā)送辦事及郵件發(fā)送辦事的控制。緊張還是根據(jù)本身的業(yè)務(wù)必要。

        2、比方咱們現(xiàn)在提供1個(gè)體系日志辦事大概打印大概掃描的辦事,咱們盼望全局只有1個(gè)訪問(wèn)入口,那么咱們就能議決這樣的單例模式來(lái)實(shí)現(xiàn)這樣的需要。

 

view source
print?
01 public class PrintHelper 
02  { 
03      #region 布局函數(shù) 
04      private PrintHelper() 
05      { 
06      } 
07  
08      public static readonly PrintHelper Instance = new PrintHelper(); 
09      #endregion 
10  
11      #region 打印辦事 
12  
13      /// <summary> 
14      /// 直接打印辦事 
15      /// </summary> 
16      /// <returns></returns> 
17      public bool Print() 
18      { 
19          return true; 
20      } 
21  
22      /// <summary> 
23      /// 打印預(yù)覽 
24      /// </summary> 
25      /// <returns></returns> 
26      public bool PrintPreview() 
27      { 
28          return true; 
29      } 
30  
31      #endregion 
32  }

        具體的調(diào)用類(lèi)咱就不寫(xiě)相應(yīng)的代碼,都與上面的情勢(shì)類(lèi)同,下面咱們講授下大概更特別的需要,偶然候咱們大概必要加載咱們創(chuàng)建的唯1實(shí)例,此時(shí)咱們?cè)鯓涌?/p>

制單例實(shí)例東西的加載呢,偶然候大概咱們有這樣的需要。下面咱們來(lái)看看怎樣實(shí)現(xiàn)這樣的需要。

        3、可加載單例東西的場(chǎng)景

        首先咱們先講下什么環(huán)境下會(huì)遇到這樣的加載要領(lǐng)呢?比方咱們想在單例模式的類(lèi)的布局函數(shù)是帶有肯定參數(shù)的環(huán)境時(shí):

 

view source
print?
01 public class UpdateHelper 
02
03     private string type = string.Empty; 
04     private static object _lock = new object(); 
05     private static UpdateHelper instance; 
06     private UpdateHelper(string valueType) 
07     { 
08         type = valueType; 
09     } 
10  
11     public static UpdateHelper Instance 
12     { 
13         get 
14         { 
15             lock (_lock) 
16             { 
17                 if (instance == null) 
18                 { 
19                     //要是這里有多個(gè)條件需要的話,大概寫(xiě)起來(lái)會(huì)比力龐大,那么有更好的要領(lǐng)來(lái)處理懲罰嗎? 
20                     instance = new UpdateHelper("test!"); 
21                 } 
22  
23                 return instance; 
24             } 
25         } 
26     } 
27 }

        那么咱們來(lái)分析幾種步伐,有沒(méi)有更好的步伐來(lái)處理懲罰呢?

        1、首先咱們不能手動(dòng)實(shí)例化,以是咱們沒(méi)有步伐動(dòng)態(tài)傳入布局函數(shù)參數(shù),只能在類(lèi)的內(nèi)部指定這個(gè)參數(shù),不過(guò)偶然候咱們必要?jiǎng)討B(tài)的加載這個(gè)參數(shù),那么這樣的

情勢(shì)顯然就沒(méi)有步伐實(shí)現(xiàn)。

        2、議決屬性的要領(lǐng),來(lái)動(dòng)態(tài)的設(shè)置屬性的內(nèi)容來(lái)完成輸出參數(shù)的變化,不過(guò)這樣的要領(lǐng)大概太甚自由,無(wú)法饜足單例模式的初衷。

        3、接口要領(lǐng),因?yàn)榻涌诒匦枰款?lèi)來(lái)實(shí)現(xiàn),以是更不靠譜,能不思量這樣的要領(lǐng)。

        4、議決Attribute的要領(lǐng)來(lái)將資訊動(dòng)態(tài)的注入到布局函數(shù)中,不過(guò)如何講這樣的要領(lǐng)是不是太發(fā)兵動(dòng)眾了呢?終究單例模式本來(lái)便是很簡(jiǎn)略的。

        5、議決配置文檔,議決config文檔配置節(jié)點(diǎn)的情勢(shì)來(lái)動(dòng)態(tài)的配置相干資訊,實(shí)現(xiàn)加載實(shí)例東西內(nèi)容的環(huán)境。

        議決上面的5種環(huán)境的分析,那么議決2、4、5能實(shí)現(xiàn)這個(gè)需求,不過(guò)比擬相應(yīng)的價(jià)格來(lái)講,5的要領(lǐng)是最機(jī)動(dòng)也是最切合單例模式本來(lái)的范例需求,相對(duì)來(lái)講

成本與價(jià)格也能汲取。

 

view source
print?
1 <?xml version="1.0" encoding="utf-8" ?> 
2 <configuration> 
3   <system.Web> 
4     <add key="ssss" >value</add> 
5   
6   </system.Web> 
7 </configuration>

 

         那么咱們上面的單力模型中的代碼只必要稍微的變革下即可,請(qǐng)看如下代碼:

 

view source
print?
01 public class UpdateHelper 
02
03     private string type = string.Empty; 
04     private static object _lock = new object(); 
05     private static UpdateHelper instance; 
06     private UpdateHelper(string valueType) 
07     { 
08         type = valueType; 
09     } 
10  
11     public static UpdateHelper Instance 
12     { 
13         get 
14         { 
15             lock (_lock) 
16             { 
17                 if (instance == null) 
18                 { 
19                     //要是這里有多個(gè)條件需要的話,大概寫(xiě)起來(lái)會(huì)比力龐大,那么有更好的要領(lǐng)來(lái)處理懲罰嗎? 
20                     instance = new UpdateHelper(System.Configuration.ConfigurationManager.AppSettings["ssss"].ToString()); 
21                 } 
22  
23                 return instance; 
24             } 
25         } 
26     } 
27 }

        咱想到這里各人都對(duì)單例模式有個(gè)簡(jiǎn)略的了解了,本文的內(nèi)容就講到這里。咱們來(lái)回顧下咱們報(bào)告的內(nèi)容:

        image

6、本文總結(jié)

        本文緊張報(bào)告了創(chuàng)建型模式中的單例模式,單例模式緊張是用來(lái)控制體系中的某個(gè)類(lèi)的實(shí)例的數(shù)量及全局的訪問(wèn)入口點(diǎn)。咱們緊張報(bào)告了實(shí)現(xiàn)單例模式的要領(lǐng),

分為外部要領(lǐng)及內(nèi)部要領(lǐng),即使咱們現(xiàn)在接納的要領(lǐng)都是內(nèi)部要領(lǐng),還報(bào)告了線程寧?kù)o的單例模式及帶有參數(shù)的布局函數(shù)的環(huán)境,根據(jù)配置文檔來(lái)實(shí)現(xiàn)參數(shù)值的動(dòng)態(tài)配

置的環(huán)境。盼望本文的講授能對(duì)不熟習(xí)計(jì)劃模式的同仁能大概相識(shí)了解單例模式的應(yīng)用,而對(duì)已熟知單例模式的同仁能溫故而知新,咱會(huì)開(kāi)心寫(xiě)好這個(gè)系列,即使咱這

里大概在大牛的面前大概是布鼓雷門(mén)吧,不外咱會(huì)連續(xù)開(kāi)心,奪取寫(xiě)出讓各人1看就明確的計(jì)劃模式系列。本文錯(cuò)誤之處再所難免,還請(qǐng)各品德評(píng)之處,咱會(huì)連續(xù)改

進(jìn)。

7、系列進(jìn)度

        創(chuàng)建型

        1、體系架構(gòu)技能之計(jì)劃模式-單件模式

        2、體系架構(gòu)技能之計(jì)劃模式-工廠模式

        3、體系架構(gòu)技能之計(jì)劃模式-抽象工廠模式

        4、體系架構(gòu)技能之計(jì)劃模式-創(chuàng)建者模式

        5、體系架構(gòu)技能之計(jì)劃模式-原型模式

        布局型

        1、體系架構(gòu)技能之計(jì)劃模式-組合模式

        2、體系架構(gòu)技能之計(jì)劃模式-表面模式

        3、體系架構(gòu)技能之計(jì)劃模式-適配器模式

        4、體系架構(gòu)技能之計(jì)劃模式-橋模式

        5、體系架構(gòu)技能之計(jì)劃模式-裝飾模式

        6、體系架構(gòu)技能之計(jì)劃模式-享元模式

        7、體系架構(gòu)技能之計(jì)劃模式-署理模式

        舉動(dòng)型

        1、體系架構(gòu)技能之計(jì)劃模式-下令模式

        2、體系架構(gòu)技能之計(jì)劃模式-觀察者模式

        3、體系架構(gòu)技能之計(jì)劃模式-戰(zhàn)略模式

        4、體系架構(gòu)技能之計(jì)劃模式-職責(zé)模式

        5、體系架構(gòu)技能之計(jì)劃模式-模板模式

        6、體系架構(gòu)技能之計(jì)劃模式-中介者模式

        7、體系架構(gòu)技能之計(jì)劃模式-表明器模式

8、下篇預(yù)告

        下篇咱們將會(huì)介紹咱們各人最熟知的項(xiàng)目模式,即使咱會(huì)更多的聯(lián)合實(shí)例來(lái)講授每個(gè)計(jì)劃模式的應(yīng)用場(chǎng)景及具體的實(shí)例,來(lái)更清楚的形貌什么環(huán)境下用什么模

式,及每個(gè)模式之間的區(qū)別。各人的支持便是咱謄寫(xiě)的動(dòng)力,盼望各人多多支持咱吧!

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)