单例模式
单例模式是一种设计模式,用于确保类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于需要全局访问一个共享资源或状态的情况,以避免多个实例引入不必要的复杂性或资源浪费。
Form1 的代码展示
using System;
using System.Windows.Forms;
namespace _2_单例模式 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
//单例1
private void button1_Click(object sender, EventArgs e) {
Class1 class1 = new Class1();
label1.Text = class1.AddNumString();
}
//单例2
private void button2_Click(object sender, EventArgs e) {
Class2 class2 = new Class2();
label1.Text = class2.AddNumString();
}
//单例3
private void button3_Click(object sender, EventArgs e) {
Class3 class3 = new Class3();
label1.Text = class3.AddNumString();
}
}
}
Danli类的代码展示
namespace _2_单例模式 {
internal class Danli {
int num = 100;
//构造函数是私有的
private Danli() { }
//实例化要放到内部
static Danli instance = null;
static object Locker = new object();
//提供一个获取单例的出口
public static Danli getInstance() {
//空的话可以实例化当前的对象,返回出去
//上锁,确保括号内的代码正常执行
lock (Locker) {
if (instance == null) {
instance = new Danli();
}
}
return instance;
}
//封装一个方法
public int AddNum() {
return num++;
}
}
}
Class1、2、3 的代码展示
namespace _2_单例模式 {
internal class Class1 {
public string AddNumString() {
Danli danli = Danli.getInstance();
return danli.AddNum().ToString();
}
}
}
单例模式和静态类的区别:
静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。
两者的区别:
1、首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类
就可以直接调用;
2、单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;
两者的使用场景:
首先如果你只是想使用一些工具方法,那么最好用静态类(静态类比单例类更快,因为静态的绑定是在编译期进行的)。
如果你要维护状态信息,或者访问资源时,应该选用单例模式。
还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类