2017.01.04 学习日记-单例模式
来源:互联网 发布:上海惠灵顿学校知乎 编辑:程序博客网 时间:2024/06/06 17:51
考试周,这几天都要焦透了,不过也让我发现,阻碍我的始终是惰性啊~~~~~~~~~~~~~~~~~~~今天学习的是单例模式~
单例模式(Singleton Pattern)
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
定义:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
代码(双重锁定):
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
定义:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
优点:
在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
避免对资源的多重占用(比如写文件操作)。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
要求生产唯一序列号。
WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
类图:代码(双重锁定):
class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance() { if (instance == null) { lock (syncRoot) { if (instance == null) { instance = new Singleton(); } } } return instance; } }class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("两对象是相同实例!"); } Console.ReadKey(); } }
private static readonly object syncRoot = new object(); //程序运行时创建一个静态只读的进程扶助对象。
lock (syncRoot) //在同一个时刻,加了锁的的那部分程序只有一个线程可以进入
0 0
- 2017.01.04 学习日记-单例模式
- Android设计模式学习日记04--单例模式
- [oc学习日记]单例模式
- OC学习日记014-单例模式和委托模式
- 黑马程序员_单例模式学习日记
- 学习日记之单例模式和Effective C++
- 学习日记 单例模式的双重锁机制
- JAVA基础第六天学习日记_static关键字、文档、静态代码块、单例开发模式
- --java多线程和单例模式--java学习日记3(基础知识)
- 单例模式学习
- 学习---单例模式
- 学习单例模式
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- 单例模式学习
- QEMU中协程的实现和使用
- App上架流程
- sleep() 和 wait() 有什么区别
- 同步和异步有何异同,在什么情况下分别使用他们
- 启动一个线程是用run()还是start()
- 2017.01.04 学习日记-单例模式
- 无交换机实现集群网络互联
- 欢迎使用CSDN-markdown编辑器
- PROCEDURE-201701
- Hadoop下Hbase启动
- 为什么在Spring的配置里,最好不要配置xsd文件的版本号
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
- 线程的基本概念、线程的基本状态以及状态之间的关系
- 如何解决linux SSH log 中不带年份的问题