前提
使用单例模式需有一下三点:
- 要有一个自己的私有类型的变量
- 要有一个私有的构造函数
- 全局访问点(static)
一、什么是单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML如下:
其中,Singleton类,定义了一个GetInstance操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例
1、Singleton类
1. class Singleton 2. { 3. private static Singleton instance; 4. 5. //构造方法让其private,这就堵死了外界利用new创建此类型实例的可能 6. private Singleton() { } 7. public static Singleton GetInstance() //此方法是获得本类实例的唯一全局访问点 8. { 9. if (instance==null) //如果实例不存在,则new一个新实例,否则返回已有的实例 10. { 11. instance = new Singleton(); 12. } 13. return instance; 14. } 15. }
2、客户端
1. static void Main(string[]args) 2. { 3. Singleton s1 = Singleton.GetInstance(); 4. Singleton s2 = Singleton.GetInstance(); 5. 6. //比较两次实例化后对象的结果是实例相同 7. if (s1==s2) 8. { 9. Console.WriteLine("两个对象是相同的实例"); 10. } 11. Console.Read(); 12. }
运行上述程序,程序台输出了“两个对象是相同的实例”,这说明Singleton1和Singleton2是相同的实例,也即一个类仅有一个实例。
二、单例模式的应用
1、什么时候使用单例模式
想要控制实例数目,节省系统资源的时候
2、优点
- 内存中只有一个实例,减少了内存开支
- 避免了对资源的多重占用
3、缺点
- 没有抽象层,扩展困难
- 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
4、使用场景
根据业务的需要来决定用不用单例模式
5、注意
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例