单例模式的特点:
确保一个类只有一个实例,并提供一个全局访问点。
- //单例模式的实现
- internal class Boss
- {
- //定义静态变量保存实例
- private static Boss uniqueBoss;
-
- //定义锁,确保线程访问安全
- private static readonly object _lock = new object();
-
- //定义私有构造函数,使外界不能创建该类实例
- private Boss()
- {
-
- }
-
- //定义公有方法提供一个全局访问点,
- public static Boss GetBoss()
- {
- //关键代码加锁
- lock (_lock)
- {
- //如果类的实例不存在则创建,否则直接返回
- if (uniqueBoss == null)
- {
- uniqueBoss = new Boss();
- }
- }
-
- return uniqueBoss;
- }
-
-
- }
-
-
- //双判断模式的写法:
- internal class Person
- {
- private Person() { }
-
- private static Person _instance;
-
- private static readonly object _instanceLock = new object();
-
- public static Person Instance()
- {
- if (_instance == null)
- {
- lock (_instanceLock)
- {
- if (_instance == null)
- {
- _instance = new Person();
- }
- }
- }
-
- return _instance;
- }
- }
实际使用:
- partial class Singleton_ViewModel : ObservableObject
- {
-
- //创建很多个Boss变量
- Boss boss_1 = Boss.GetBoss();
- Boss boss_2 = Boss.GetBoss();
- Boss boss_3 = Boss.GetBoss();
-
- [ObservableProperty]
- private string name;
-
- [ObservableProperty]
- private int age;
-
- [ObservableProperty]
- private string sex;
-
- [RelayCommand]
- private void Li()
- {
- Name = boss_1.Name = "李总";
- Age = boss_1.Age = 38;
- Sex = boss_1.Sex = "男";
-
- Boss1 = boss_1 == boss_2 ? "boss_1 = boss_2" : "boss_1 != boss_2";
- }
-
- [RelayCommand]
- private void Xie()
- {
- Name = boss_2.Name = "谢总";
- Age = boss_2.Age = 56;
- Sex = boss_2.Sex = "女";
-
- Boss2 = boss_1 == boss_2 ? "boss_1 = boss_2" : "boss_1 != boss_2";
- }
-
- [RelayCommand]
- private void Zhang()
- {
- Name = boss_3.Name = "张总";
- Age = boss_3.Age = 29;
- Sex = boss_3.Sex = "男";
-
- Boss3 = boss_2 == boss_3 ? "boss_2 = boss_3" : "boss_2 != boss_3";
- }
-
- [ObservableProperty]
- private string boss1;
-
- [ObservableProperty]
- private string boss2;
-
- [ObservableProperty]
- private string boss3;
-
-
- [RelayCommand]
- private void t1()
- {
- Task.Run(() =>
- {
- while (true)
- {
- Li();
- Task.Delay(1000);
- }
-
- });
- }
-
- [RelayCommand]
- private void t2()
- {
- Task.Run(() =>
- {
- while (true)
- {
- Xie();
- Task.Delay(1500);
- }
-
- });
- }
-
- [RelayCommand]
- private void t3()
- {
- Task.Run(() =>
- {
- while (true)
- {
- Zhang();
- Task.Delay(2000);
- }
-
- });
- }
- }