Singlton设计模式

  • 作用场景:

    1. 当系统中某个类必须仅有一个实例对象,同时访问该系统的所有访问者必须访问同一个实例对象时,且该对象实例自身占用资源又不大时。

    2. 在C/s应用程序中,当我们要保证某一个非模式窗口,只能显示一个实例时。

  • 实现推荐方案:   
 1 /// <summary>
 2     /// Description of SiteSettings.
 3     /// </summary>
 4     public class SiteSettings
 5     {
 6         private static SiteSettings instance=null;
 7         private static object locker=new object();
 8
 9         public SiteSettings()
10         {
11         }
12
13         public static SiteSettings Instance {
14             get {
15                 if(instance==null)
16                 {
17                     Console.WriteLine("Install equals null.");
18                     lock(locker)
19                     {
20                         if(instance ==null)
21                         {
22                             Console.WriteLine("new SiteSettings instance.");
23                             instance=new SiteSettings();
24                         }
25                     }
26                 }
27                 return instance;
28             }
29         }
30
31         private bool siteClosed=false;
32
33         public bool SiteClosed {
34             get { return siteClosed; }
35             set { siteClosed = value; }
36         }
37     }

  调用:

 1 class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             Console.WriteLine("Hello World!");
 6
 7             // TODO: Implement Functionality Here
 8
 9             Console.WriteLine(SiteSettings.Instance.SiteClosed);
10             Console.WriteLine(SiteSettings.Instance.SiteClosed);
11             SiteSettings.Instance.SiteClosed=true;
12             Console.WriteLine(SiteSettings.Instance.SiteClosed);
13
14             Console.Write("Press any key to continue . . . ");
15             Console.ReadKey(true);
16         }
17     }

  运行结果:

  • 其他实现方案:

  1.) 方案1

 1      /// <summary>
 2     /// Description of MemberBO.
 3     /// </summary>
 4     public class SiteSettings
 5     {
 6         private static SiteSettings instance=null;
 7         private static object locker=new object();
 8
 9         public SiteSettings()
10         {
11         }
12
13         public static SiteSettings Instance {
14             get {
15                 if(instance ==null){
16                     Console.WriteLine("Install equals null.");
17                     lock(locker){
18                         Console.WriteLine("Enter locker.");
19                         Console.WriteLine("new SiteSettings instance.");
20                         instance=new SiteSettings();
21                     }
22                 }
23                 return instance;
24             }
25         }
26
27         private bool siteClosed=false;
28
29         public bool SiteClosed {
30             get { return siteClosed; }
31             set { siteClosed = value; }
32         }
33     }

  2.) 方案2:   

 1 /// <summary>
 2     /// Description of MemberBO.
 3     /// </summary>
 4     public class SiteSettings
 5     {
 6         private static SiteSettings instance=null;
 7         private static object locker=new object();
 8
 9         public SiteSettings()
10         {
11         }
12
13         public static SiteSettings Instance {
14             get {
15                 Console.WriteLine("Install equals null.");
16                 lock(locker){
17                     if(instance ==null){
18                         Console.WriteLine("Enter locker.");
19                         Console.WriteLine("new SiteSettings instance.");
20                         instance=new SiteSettings();
21                     }
22                 }
23   return instance;
25             }
26         }
27
28         private bool siteClosed=false;
29
30         public bool SiteClosed {
31             get { return siteClosed; }
32             set { siteClosed = value; }
33         }
34     }

  3.) 方案3:  

 1 /// <summary>
 2     /// Description of MemberBO.
 3     /// </summary>
 4     public class SiteSettings
 5     {
 6         private static SiteSettings instance=null;
 7         private static object locker=new object();
 8
 9         public SiteSettings()
10         {
11         }
12
13         public static SiteSettings Instance {
14             get {
15                     Console.WriteLine("Install equals null.");
16                     if(instance ==null){
17                         Console.WriteLine("new SiteSettings instance.");
18                         instance=new SiteSettings();
19                     }
20                 }
21                 return instance;
22             }
23         }
24
25         private bool siteClosed=false;
26
27         public bool SiteClosed {
28             get { return siteClosed; }
29             set { siteClosed = value; }
30         }
31     }

  • 为什么不推荐:
  1. 方案1,虽然考虑了线程安全,但还不是足够的安全,还没有双重锁定安全
  2. 方案2,虽然考虑了线程安全,但每次都要进入locker,即使instance对象已经赋值后
  3. 方案3,线程安全问题就没有考虑。
  • 注意混淆问题:

  不要和Monitor,ReaderWriterLockSlim等这些线程安全的使用方式混淆。

1.) Monitor:提供同步访问对象的机制。

2.) ReaderWriterLockSlim:表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。

  • 优缺点:

  1.)优点:

    a.)确保了系统中保存一个实例对象,为程序带来了开拓思路;

    b.)内存开销可能会占用一定空间,但它避免了每次都需要开辟空间的消费;

    c.)使得程序能逻辑清理,开发者可以单一的使用该实例对象去操作,而不别每次都要new一个实例对象来进行操作。

  2.缺点:

    a.)多个用户在操作这个对象时,线程的安全性,就需要考虑。

    b.)一直在占用资源,而不可以被回收。

时间: 2024-10-27 18:35:03

Singlton设计模式的相关文章

常用的设计模式总结

通过总结这些模式,让我找到了封装变化,对象的耦合,针对接口编程,都有了一定的了解,从而设计出易维护,易扩展,灵活性好的程序.有以下常用的: 1)单件模式.2)抽象工厂模式和工厂模式.3)适配器模式.4)装饰模式.5)观察者模式.6)外观模式 其他模式目前还很少用到. 单件模式 这是用的最多的模式,每一个正式的软件都要用它,全局配置.唯一资源.还有一个就是所有的工厂我都设计为单件模式,因此它的使用量大于工厂模式和抽象工厂模式之和.是用来创建一个需要全局唯一实例的模式.只是需要纠正一点.single

最常用的设计模式

http://www.cnblogs.com/fora/archive/2011/04/29/2032829.html 最常用的设计模式 最常用的设计模式设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验. 最常用的设计模式根据我的经验我把我经常用到的设计模式在这里做个总结,按照我的经验,它们的排序如下:1)单件模式.2)抽象工厂模式和工厂模式.3)适配器模式.4)装饰模式.5)观察者模式.6)外观模式 其他模式目

Java设计模式——创建型模式之单例模式

一.概述 作为第一个出场的设计模式,有必要先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式使代码编写真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式概念的介绍,参见:http://blog.jobbole.com/101076/ 其中涉及的设计原则的概念,参见随笔:http://www.c

10大APP界面框架设计模式详解

随着移动互联网的发展,移动app已经成为了每个互联网公司的标配了,那作为产品经理,我们如何设计出更加符合用户体验的app产品呢?今天和大家分享的就是10中最常见的app界面光甲设计模式,一起来看看吧. 1.标签导航 标签导航是十大界面框架设计里最常用的界面框架设计,也是被业界之内公认的一种普遍使用的页面框架设计.那么这种页面框架设计在作业方面对一个用户来说也是最常见的一种页面框架设计,比如说微博.微信.手机百度.支付宝.淘宝,这些我们所谓的超级APP都是运用的标签导航,无一例外.从这个角度也可以

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

Happy 设计模式之适配器模式(JAVA)

设计模式-适配器模式 适配器模式定义 适配器模式,将一个类的的接口转换成客户或者产品希望的接口形式,就是原本不兼容或者甚至不相干的接口不能一起工作的接口一起工作,完成需求或者客户的需求. 适配器模式的使用场景 1.当你使用一个已经存在的类,而他的接口不符合你的需求. 2.你想要创建一个复用的类,该类可以与其相关的类或者不可见的类协同工作. 适配器角色 Target:目标接口 TargetImpl:目标实现类 Adapter:适配器 Adaptee:被适配者 代码解析: package com.d

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

设计模式之单列模式

设计模式之单列模式 1,何为单列模式? 即singleton 在某个类采用了单列模式之后  其只能有一个实列对象 ,并且这个实列对象只能有内部自己创建并提供给外部的调用. 2.实现单列模式的方法 分为 :饿汉式 ,懒汉式 下面为饿汉式实现代码: public calss Singleton1{ //将构造函数私有化 防止外部通过new来创建对象 private Singleton1(){ } //创建一个私有静态变量并直接初始化 类加载的时候直接创建对象 private static Singl