单例模式(Singleton)
2016-06-26 17:19
162 查看
单例模式(Singleton)
保证一个类仅有一个实例,提供一个访问它的全局访问点。1.饿汉式单例类
静态初始化的方式:自己被加载时就将自己实例化。所有要提前占用系统资源C#与公共语言运行库提供。
Singleton类:
public sealed class Singleton //阻止派生 { private static readonly Singleton instance=new Singleton (); //第一次引用类时创建实例。 private Singleton (){} public static Singleton GetInstance() { return instance ; } }
客户端
Singleton s1 = Singleton.GetInstance();//得到实例s1 Singleton s2 = Singleton.GetInstance(); if(s1==s2) { Console.WriteLine("两个对象是相同的实例"); } Console.Read();
2.懒汉式单例类
第一次被引用时,才将自己实例化。面临着多线程访问的安全性问题。需要双重锁定才可以保证安全Singleton类:
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)//若实例不存在,则new一个新实例。否则返回已有的实例 { instance = new Singleton(); } } } return instance; } }客户端代码相同。省略……
————————————————————————————————————————————————————————————
懒汉——单例模式:子窗体加载
public partial class FormToolbox : Form { private static FormToolbox ftb = null; private static readonly object syncRoot = new object(); private FormToolbox() { InitializeComponent(); } //得到类实例的方法。返回值就是本类对象,注意也是静态 public static FormToolbox GetInstance() { if (ftb == null || ftb.IsDisposed) { lock (syncRoot) { if (ftb == null || ftb.IsDisposed) { ftb = new FormToolbox(); ftb.MdiParent = Form1.ActiveForm; ftb.Show(); } } } return ftb; } }form1窗体(父窗体)
private void Form1_Load(object sender, EventArgs e) { this.IsMdiContainer = true;//属性 } private void ToolStripMenuItemToolbox_Click(object sender, EventArgs e) { FormToolbox .GetInstance ().Show (); } private void toolStripButton1_Click(object sender, EventArgs e) { FormToolbox.GetInstance().Show(); }效果图
相关文章推荐
- 用JS实现轮播图效果(二)
- makefile:make -C M=参数的使用
- 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个。
- 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个。
- (3) ebj学习:有状态bean和无状态bean区别
- xml(Dom4J)解析原理及代码--Dom4J学习小计
- 词频统计_输入到文件
- Express.js安装
- Python读写txt文本文件的操作方法全解析
- 【GOF23设计模式】_中介者模式_同事协作类_内部类实现JAVA245
- Myeclipse写servlet程序启动tomcat后无法进入debug模式的解决方法
- Cash Machine poj 1276(多重背包)
- 221. Maximal Square
- cygwin与vim配置
- iOS开发系列--并行开发其实很容易
- C++ string的常用功能
- UE4的类前缀
- Android 解析JSON格式数据
- C++ string的常用功能
- 开源大数据处理引擎汇总(一)