经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Singleton单例模式
来源:cnblogs  作者:大师兄石头  时间:2021/2/18 15:34:54  对本文有异议

>>返回《C#常用设计模式》

1. 简介

定义

保证一个类仅有一个实例,并提供一个该实例的全局访问点。

注意

  1. 单例模型下实例化操作应该是类的设计者的责任,而不是使用者的责任。
  2. 在该类中直接提供实例化的方法,保证实例唯一

2. 示例

2.1. 最常见的单例模式

  1. public class Singleton
  2. {
  3. //保存实例容器
  4. private static Singleton instance = null;
  5. //取消默认的public的缺省构造器
  6. private Singleton() { }
  7. //实例的出口
  8. public static Singleton Instance
  9. {
  10. get
  11. {
  12. if (instance == null)
  13. {
  14. instance = new Singleton();
  15. }
  16. return instance;
  17. }
  18. }
  19. }

2.2. 线程安全的单例模式

  1. public class Singleton
  2. {
  3. //volatile 它是被设计用来修饰被不同线程访问和修改的变量。
  4. //如果没有volatile,基本上会导致这样的结果:
  5. //要么无法编写多线程程序,要么编译器失去大量优化的机会。
  6. //volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
  7. private static volatile Singleton instance = null;
  8. private static object lockHelper = new object();
  9. //取消默认的public的构造器
  10. private Singleton() { }
  11. //实例的出口
  12. public static Singleton Instance
  13. {
  14. get
  15. {
  16. //double check 前面的判断是为了减少后面判断的访问,因为后面的判断会阻塞并发线程
  17. if (instance == null)
  18. {
  19. lock (lockHelper)
  20. {
  21. if (instance == null)
  22. {
  23. instance = new Singleton();
  24. }
  25. }
  26. }
  27. return instance;
  28. }
  29. }
  30. }

2.3. 线程安全且简练的单例模式

利用了静态构造方法是线程安全的。

缺点: 不接受参数

  1. public class Singleton
  2. {
  3. public static readonly Singleton Instance = new Singleton();
  4. private Singleton() { }
  5. }

等价于

  1. public class Singleton
  2. {
  3. public static readonly Singleton Instance;
  4. static Singleton()
  5. {
  6. Instance = new Singleton();
  7. }
  8. private Singleton() { }
  9. }

说明:

  1. 静态构造器执行时间:在静态字段初始化之前执行。
  2. 内联初始化编译后会将初始化的内容放到静态构造器内部执行
  3. 静态构造器只能被一个线程执行一次,不可能被多线程执行

2.4. 含参数的单例模式

一般情况下用不到。

  1. public class Singleton
  2. {
  3. //保存实例容器
  4. private static Singleton instance;
  5. //取消默认的public的构造器
  6. private Singleton(int x,int y)
  7. {
  8. this.x = x;
  9. this.y = y;
  10. }
  11. //实例的出口
  12. public static Singleton GetInstance(int x, int y)
  13. {
  14. if (instance == null)
  15. {
  16. instance = new Singleton(x,y);
  17. }
  18. else
  19. {
  20. instance.x = x;
  21. instance.y = y;
  22. }
  23. return instance;
  24. }
  25. private int x;
  26. private int y;
  27. }

原文链接:http://www.cnblogs.com/BigBrotherStone/p/singleton.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号