西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → 系统架构技能之设计模式-单件模式

系统架构技能之设计模式-单件模式

相关软件相关文章发表评论 来源:本站整理时间:2010/10/3 19:08:52字体大小:A-A+

作者:佚名点击:85次评论:0次标签: 架构

  • 类型:电子教程大小:23.1M语言:中文 评分:10.0
  • 标签:
立即下载

1、开篇

       其实咱本来不是筹划把体系架构中的1些计划模式单独抽出来讲授的,因为许多的好朋友也比力关注这方面的内容,以是咱想议决咱明白及通常项目中应用到的1

些常见的计划模式,拿出来给各人做个简略讲授,咱这里只是抛砖引玉,要是某个地方讲授的不精确大概不细致,请各品德评指出。园子内里的许多的大牛写的计划模式

都特别的经典,咱这里写大概有点布鼓雷门的以为,不外咱还是决定把它写出来,盼望能对初学者有肯定的资助与引导的作用。即使咱这里要是讲某个地方表明的有问

题大概讲是某个地方写的不切合逻辑之处,还请各人多多指出,提着名贵意见。

       软件项目中其实有许多总结性的话语,好比讲软件=算法 数据布局等等这样的形貌,即使咱们这里大概算法便是泛指1些软件中的编程要领了,计划模式如何去

明白呢?为什么要有计划模式?它能带来什么?等等这些都是咱们必要讨论的问题。首先咱们必要了解计划模式能带来什么。大概这才是咱们学习它的紧张缘故原由,要是

讲不能为咱们在誊写软件的进程中带来更方面的利益,那咱们也不会利用与学习它。

       计划模式是什么?

       计划模式能简略的明白为办理某1系列问题的完善的办理方案。咱们在软件开辟的进程中每每遇到计划成果实现的问题,而计划模式正是为相识决软件计划成果

实现时遇到的某1类问题的办理方案。因为1样平常环境下来讲,咱们在某个软件成果的开辟进程中遇到的成果计划问题,大概是古人很早就遇到过的问题,以是议决这种

计划模式的要领来办理,能让咱们在软件实现的进程中少走弯路,大概讲是给咱们的软件计划带来很好的机动性与顺应性。

       计划模式带来了什么?

       计划模式是源于实践,并且每种计划模式都包罗了1个问题形貌,问题涉及到的加入者并且提供了1个实际的办理方案。计划模式的利益咱们能议决下图来简略

阐明:

       image 即使咱这里大概总结还不完全,还请各人增补,咱会加载这内里的内容。即使设

计模式带来了这么多的利益,以是咱们学习计划模式就显得比力须要了,也是从事软件开辟及计划必需掌控的根本技能之1。

       计划模式的简略分类:

       image 即使这里能简略的分为这3大类,下面咱们在报告的进程中将会分别讲授,即使咱这里所以创建型模

式开始讲授,咱想创建型模式也是各人项目中必备的吧?下面咱就从创建型模式先来讲授。

2、择要

       本文将紧张讲授创建型模式中的单例模式先来讲授,因为单例模式是最简略也是最容易明白的计划模式,上手快,易利用的计划模式。本文将从下面的流程来讲授

单例模式,背面报告的计划模式也将利用这样的要领。

       1、什么是单例模式?

       2、单例模式的应用场景。

       3、举例阐明单例模式的利用。

       4、总结单例模式的用法。

3、本文大纲

       a、开篇。

       b、择要。

       c、本文大纲。

       d、单例模式的剧情。

       e、相干应用场景分析。

       f、本文总结。

       g、系列进度。

       h、下篇预告。

4、单例模式的剧情

       本章咱们将来报告下单例模式的利用,首先咱们来看看单例模式的定义:

       单例模式:是1种软件计划中经常使用的计划模式,紧张是用来控制某个类必需在某个应用步调中只能有1个实例存在。

       偶然候咱们必要确保整个体系中只有某个类的1个实例存在,这样有利于咱们与谐控制体系的举动。比方:咱们在某个体系中利用了发送短信的这样的办事,那么

咱们大概盼望议决单1的短信办事类的实例,而不是多个东西实例完成短信的发送办事。此时咱们能议决单例模式来完成。

       image 上图简略形貌了单例模式应用的位置。

        咱们看看单例模式的几种实现要领:

        image

        下面咱们来举例阐明下这2种要领的实现。

        1、外部控制的要领

 

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、内部控制要领

 

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 }

        这里有几点必要过细的地方,对付第2种要领有几个地方必要阐明下,首先是要控制全局只有1个实例的类,请定义成静态实例,如允许以确保只有1个实例对

象,其次,这个东西的布局函数请声明成掩护范例的成员,如允许以屏蔽议决直接实例化的情势来访问。议决这样的情势,客户能不必要了解某个单例实例东西的内

部实现细节。1样平常环境下餍足上面的2点需要就能完成全局唯1访问入口的控制。即使大概在多线程的环境下接纳这样的情势还会有肯定的毛病,即使咱们这里也简略

的讲授下相应的控制方案。方案如下:

           

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

       看吧很简略吧,即使咱们这里来简略表明下原理:

       1、咱们先把布局函数声明为私有的布局函数,这样咱们能大概屏蔽外部议决实例化的情势访问内部的成员函数。全部的成员函数的访问必需议决静态成员Instance

来完成访问。

       2、这段代码议决定义大众、静态、只读的成员相当于在类被第1次利用时实行布局,因为是只读的,以是1旦布局后不容许修正,就不用担心不宁静的问题。

        信赖对上面的介绍各人应该根本上了解单例模式的应用了,那么下面咱们来看看项目中的实际应用场景及用法。

5、相干应用场景讲授

        1、场景短信及邮件发送办事

        那么咱们将接纳上面介绍的最“COOL”的要领来举行控制,提供发送短信及发送邮件的办事。

 

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     /// 发送手机短信 
11     /// </summary> 
12     public bool SendMessage(string telNumber,string content) 
13     { 
14         return true; 
15     } 
16  
17     /// <summary> 
18     /// 发送邮件 
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 }

        咱们再来看看调用类中怎样誊写完成调用。比方咱们有个订单类,当有人新下订单时,将给卖家发送短信提示成果。

         

view source
print?
01 /// <summary> 
02  /// 订单业务 
03 /// </summary> 
04 public class Order 
05
06     public int Save() 
07     { 
08         //先是将订单的相干资讯生成, 
09         this.InitOrderInfo(); 
10  
11         //实行订单的长期化要领 
12         int count= this.Add(); 
13  
14         //发送短信 
15         CoolInstance.Instance.SendMessage(string.Empty, string.Empty); 
16         //发送邮件 
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 }
       

        这样咱们就完成了短信发送办事及邮件发送办事的控制。紧张还是根据本身的业务必要。

        2、比方咱们现在提供1个体系日志办事大概打印大概扫描的办事,咱们盼望全局只有1个访问入口,那么咱们就能议决这样的单例模式来实现这样的需要。

 

view source
print?
01 public class PrintHelper 
02  { 
03      #region 布局函数 
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      /// 打印预览 
24      /// </summary> 
25      /// <returns></returns> 
26      public bool PrintPreview() 
27      { 
28          return true; 
29      } 
30  
31      #endregion 
32  }

        具体的调用类咱就不写相应的代码,都与上面的情势类同,下面咱们讲授下大概更特别的需要,偶然候咱们大概必要加载咱们创建的唯1实例,此时咱们怎样控

制单例实例东西的加载呢,偶然候大概咱们有这样的需要。下面咱们来看看怎样实现这样的需要。

        3、可加载单例东西的场景

        首先咱们先讲下什么环境下会遇到这样的加载要领呢?比方咱们想在单例模式的类的布局函数是带有肯定参数的环境时:

 

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                     //要是这里有多个条件需要的话,大概写起来会比力庞大,那么有更好的要领来处理惩罚吗? 
20                     instance = new UpdateHelper("test!"); 
21                 } 
22  
23                 return instance; 
24             } 
25         } 
26     } 
27 }

        那么咱们来分析几种步伐,有没有更好的步伐来处理惩罚呢?

        1、首先咱们不能手动实例化,以是咱们没有步伐动态传入布局函数参数,只能在类的内部指定这个参数,不过偶然候咱们必要动态的加载这个参数,那么这样的

情势显然就没有步伐实现。

        2、议决属性的要领,来动态的设置属性的内容来完成输出参数的变化,不过这样的要领大概太甚自由,无法餍足单例模式的初衷。

        3、接口要领,因为接口必需要靠类来实现,以是更不靠谱,能不思量这样的要领。

        4、议决Attribute的要领来将资讯动态的注入到布局函数中,不过如何讲这样的要领是不是太发兵动众了呢?终究单例模式本来便是很简略的。

        5、议决配置文档,议决config文档配置节点的情势来动态的配置相干资讯,实现加载实例东西内容的环境。

        议决上面的5种环境的分析,那么议决2、4、5能实现这个需求,不过比拟相应的价格来讲,5的要领是最机动也是最切合单例模式本来的范例需求,相对来讲

成本与价格也能汲取。

 

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>

 

         那么咱们上面的单力模型中的代码只必要稍微的变革下即可,请看如下代码:

 

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                     //要是这里有多个条件需要的话,大概写起来会比力庞大,那么有更好的要领来处理惩罚吗? 
20                     instance = new UpdateHelper(System.Configuration.ConfigurationManager.AppSettings["ssss"].ToString()); 
21                 } 
22  
23                 return instance; 
24             } 
25         } 
26     } 
27 }

        咱想到这里各人都对单例模式有个简略的了解了,本文的内容就讲到这里。咱们来回顾下咱们报告的内容:

        image

6、本文总结

        本文紧张报告了创建型模式中的单例模式,单例模式紧张是用来控制体系中的某个类的实例的数量及全局的访问入口点。咱们紧张报告了实现单例模式的要领,

分为外部要领及内部要领,即使咱们现在接纳的要领都是内部要领,还报告了线程宁静的单例模式及带有参数的布局函数的环境,根据配置文档来实现参数值的动态配

置的环境。盼望本文的讲授能对不熟习计划模式的同仁能大概相识了解单例模式的应用,而对已熟知单例模式的同仁能温故而知新,咱会开心写好这个系列,即使咱这

里大概在大牛的面前大概是布鼓雷门吧,不外咱会连续开心,夺取写出让各人1看就明确的计划模式系列。本文错误之处再所难免,还请各品德评之处,咱会连续改

进。

7、系列进度

        创建型

        1、体系架构技能之计划模式-单件模式

        2、体系架构技能之计划模式-工厂模式

        3、体系架构技能之计划模式-抽象工厂模式

        4、体系架构技能之计划模式-创建者模式

        5、体系架构技能之计划模式-原型模式

        布局型

        1、体系架构技能之计划模式-组合模式

        2、体系架构技能之计划模式-表面模式

        3、体系架构技能之计划模式-适配器模式

        4、体系架构技能之计划模式-桥模式

        5、体系架构技能之计划模式-装饰模式

        6、体系架构技能之计划模式-享元模式

        7、体系架构技能之计划模式-署理模式

        举动型

        1、体系架构技能之计划模式-下令模式

        2、体系架构技能之计划模式-观察者模式

        3、体系架构技能之计划模式-战略模式

        4、体系架构技能之计划模式-职责模式

        5、体系架构技能之计划模式-模板模式

        6、体系架构技能之计划模式-中介者模式

        7、体系架构技能之计划模式-表明器模式

8、下篇预告

        下篇咱们将会介绍咱们各人最熟知的项目模式,即使咱会更多的联合实例来讲授每个计划模式的应用场景及具体的实例,来更清楚的形貌什么环境下用什么模

式,及每个模式之间的区别。各人的支持便是咱誊写的动力,盼望各人多多支持咱吧!

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)