今天我们来探索一下Singleton设计模式的实现及应用场景。

Singleton模式属于Creational Type(创建型)设计模式的一种。该模式一般用于确保在应用中仅创建一个某类的instance,在应用中的各个地方对该类的实例对象的引用均指向同一instacne。

Singleton模式的优势:它提供了对资源的concurrent(一致)访问,避免了创建多个实例对象,浪费内存空间。

Singleton模式实现准则:

1、确保仅有一个类的实例对象

2、提供对唯一实例对象的全局访问,该规则又可细分为3条规则。

  • 声明该类的所有构造器为private
  • 提供返回实例对象的引用的静态方法
  • 实例对象被存储为类的private static字段

下面通过例子实现Singleton模式,在具体实现时,我们首先实现不使用Singleton模式的代码,然后一步一步地将其改造成Singleton模式。

 namespace Singleton
{
class Program
{
static void Main(string[] args)
{
Singleton s1 = new Singleton();
s1.PrintMessage("this is first message"); Singleton s2 = new Singleton();
s2.PrintMessage("this is second message"); Console.ReadKey();
}
}
class Singleton
{
private static int counter = ;
public Singleton()
{
counter++;
Console.WriteLine("这是第"+counter.ToString()+"次调用构造函数");
}
public void PrintMessage(String str)
{
Console.WriteLine(str);
}
}
}

运行结果如下图:

  可以看出,在不使用Singleton模式时,每次使用类Singleton的PrintMessage方法时,都需要创建一个新的实例对象,这造成了极大的浪费。下面我们按照上面所说的准则将它改造成使用Singleton模式。

 namespace Singleton
{
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.getInstance;
s1.PrintMessage("this is first message"); Singleton s2 = Singleton.getInstance;
s2.PrintMessage("this is second message"); Console.ReadKey();
}
}
public sealed class Singleton
{
private static int counter = ;
private static Singleton instance=null; public static Singleton getInstance
{
get
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
private Singleton()
{
counter++;
Console.WriteLine("这是第"+counter.ToString()+"次调用构造函数");
}
public void PrintMessage(String str)
{
Console.WriteLine(str);
}
}
}

运行结果如下图:

  另外,需要注意的是,不要忘了在Singleton类的声明中添加sealed关键字,它确保了Singleton类不可被继承。当Singleton类可被继承且继承类位于Singleton基类外部时,由于Singleton基类的构造函数声明为private,此时运行程序会产生Singleton.Singleton()受保护级别限制不可访问的编译错误;当Singleton类可被继承且继承类位于Singleton基类内部构成嵌套类时,这时在main()方法中就可以创建多个继承类的instance,这就违背了Singleton模式的设计初衷:仅能创建该类型的一个instance。

  最后,上述代码仅在单线程环境中运行良好,在下篇中介绍多线程环境中的实现,及Double-checked locking和lazy initialization的相关概念。

最新文章

  1. excel小技巧
  2. [leetcode] 47. Permutations II
  3. Java Swing快速构建窗体应用程序
  4. 【翻译一】java-并发
  5. 重建 windows 图标缓存
  6. NSDictionary
  7. vim的Tab设置为4个空格
  8. oracle desc 表结构
  9. nyoj 76 超级台阶
  10. 安装centreon
  11. loadrunner做webservice接口之简单调用
  12. JSTL和select标签的组合使用
  13. Objective-C中的SEL、IMP和Class类型
  14. docker安装使用
  15. 查找第k小的元素(O(n)递归解法)
  16. demo_1
  17. js字符串String提取方法比较
  18. 1094 和为k的连续区间(暴力)
  19. office online server部署和简单操作
  20. ASP入门(十一)-Session小案例

热门文章

  1. Sum of Consecutive Prime Numbers
  2. Lunch Time(费用流变型题,以时间为费用)
  3. ECMAScript5新特性之isFrozen、freeze
  4. [freeCodeCamp] Start a Nodejs Server - Complete "Make it Modular"
  5. 那些你不知道的PS大片摄影
  6. 16进制string转成int
  7. 测试用例excel模板
  8. 2018.10.14 NOIP训练 圣诞树(简单dp)
  9. 2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)
  10. ThinkPHP5 union分页