原版地址: http://www.unitymanual.com/blog-27799-3016.html
设计模式学习笔记_单例模式(Singleton)
单例模式(Singleton)概述:
单例模式是一种常用的软件设计模式。在它的核心结构种只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
定义:
要求一个类有且仅有一个实例,并且提供了一个全局的访问点,在同一时刻只能被一个线程所访问。
特点:
² 单例类只能有一个实例。
² 单例类必须自身创建唯一实例。
² 单例类必须给所有其他对象提供唯一实例。
使用频率:
4星
单例模式结构图:
参与者:
Singleton:被调用的单例对象;
在单例模式中,通常由Instance()或GetInstance()方法负责对象的创建,该方法应该保证每个需要单例对象的客户端均能访问。
单例模式结构实现:
² 单例类有一个私有的无参数构造函数,这可以防止被其他类实例化,而且单例类也不应该被继承,如果单例类允许继承那么每个子类都可以创建实例,这就违背了单例模式的“唯一实例”原则。
² 单例类使用sealed修饰,可以阻止被继承。
² 使用一个公有的静态方法来获取单一实例的引用,如果实例为NULL即创建一个。
1、 ///
2、 /// 单例模式
3、 /// 单例类
4、 ///
5、 public sealed class Singleton
6、 {
7、 private static Singleton _instance;
8、
9、 public Singleton()
10、 {
11、
12、 }
13、 //提供外部调用函数
14、 public static Singleton Instance()
15、 {
16、 if (_instance == null)
17、 {
18、 _instance = new Singleton;
19、 }
20、 return _instance;
21、 }
22、
23、 }
24、 ///
25、 /// 客户端调用
26、 ///
27、 public class Client
28、 {
29、 static void Main(string[] args)
30、 {
31、
32、 Singleton s1 = Singleton.Instance();
33、 Singleton s2 = Singleton.Instance();
34、
35、 if (s1 == s2)
36、 {
37、 Console.WriteLine("对象为相同实例");
38、 //输出 对象为相同实例
39、 }
40、
41、 }
42、}
单例模式实例:
Word文档在同一时间只能有一个用正在编辑
1、 ///
2、 /// 单例模式
3、 /// 单例类
4、 ///
5、 public sealed class Singleton
6、 {
7、 private static Singleton _instance;
8、 //防止被new实例话
9、 private Singleton()
10、 {
11、
12、 }
13、 //提供外部调用函数
14、 public static Singleton Instance()
15、 {
16、 if (_instance == null)
17、 {
18、 _instance = new Singleton;
19、 Console.WriteLine("Word文档打开成功,可写入");
20、 }else
21、 {
22、 Console.WriteLine("Word文档锁定,不可写入");
23、 }
24、 return _instance;
25、 }
26、
27、 }
28、 ///
29、 /// 客户端调用
30、 ///
31、 public class Client
32、 {
33、 static void Main(string[] args)
34、 {
35、
36、 Singleton s1 = Singleton.Instance();
37、 Singleton s2 = Singleton.Instance();
38、
39、 Console.ReadKey();
40、 //输出 对象为相同实例
41、
42、
43、 }
44、 }
单例模式应用分析
注意:
² 不要使用单例模式存取全局变量。这违背了单例模式的用意,最好放到对应类的静态成员中。
² 不要将数据库连接做成单例模式,因为一个系统可能会与多个数据库有连接,并且在有连接池的情况下,应该尽可能释放连接。Singleton模式由于使用静态成员存储类实例,所以可能会造成资源无法及时释放。
单例模式适用情形:
当类只能有一个实例而且客户可以从一个重所周知的访问点访问时;
当这个唯一实例应该时通过子类化可扩展,并且客户应该无需更改代码就能适用一个扩展的实例时。
特点:
² 实例控制:Single会阻止其他对象实例化其自己的Singleton对象的副本,从而确保所有对象都方位唯一实例;
² 额外开销:虽然很小,单如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销;
² 可能的开发混淆:适用Singleton对象时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类;
² 对象的生产期问题:singleton不能解决删除单个对象的问题。