C#演示单例模式

单例模式的特点:

确保一个类只有一个实例,并提供一个全局访问点。

cs 复制代码
 //单例模式的实现
    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;
        }
    }

实际使用:

cs 复制代码
 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);
                }

            });
        }
    }
相关推荐
mudtools5 小时前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
大飞pkz11 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
唐青枫13 小时前
从入门到进阶:C#.NET Stopwatch 计时与性能测量全攻略
c#·.net
未来之窗软件服务1 天前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
1uther1 天前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
阿幸软件杂货间1 天前
Office转PDF转换器v1.0.py
开发语言·pdf·c#
sali-tec1 天前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
玉面小君1 天前
从 WPF 到 Avalonia 的迁移系列实战篇6:Trigger、MultiTrigger、DataTrigger 的迁移
wpf·avalonia
Tiger_shl1 天前
【层面一】C#语言基础和核心语法-02(反射/委托/事件)
开发语言·c#
Wadli1 天前
C++语法 | static静态|单例模式
开发语言·c++·单例模式