• 【每天进步一点】C#设计模式(一)单例模式


    一、引言

    本期该给大家讲设计模型,设计模型在程序中运用非常的广泛,你不经意写的方法,调的接口,可以就是一种简单的设计模型,设计模型是程序开发中针对特定问题的解决方案总结。

    二、设计模型

    设计模型主要分为:创建型设计模式、结构型设计模式与行为型设计模式。
    其实这几个模型都离不开我们之前讲的对象的六大原则。

    三、单例模式

    好了,废话不多说,开始讲第一个,创建型设计模式中的单例模式。
    在讲之前给大家讲一下什么是创建型设计模式,听这个名字我们就知道是创建某个东西而设计的,这里我们研究的是对象的创建,就是用来解决对象实例化和使用的客户端耦合的模式,可以让客户端和对象实例化都独立变化,做到相互不影响。

    创建模式包括:
    【1.1】简单工厂:解决了单一对象的创建问题。

    【1.2】抽象工厂:解决了多组对象的创建问题。

    【1.3】单利模式:对象使用中始终保持唯一。

    四、案例

    简单工厂与抽象工厂我们先不讲,接下来我们看单例模式,废话不多说直接上代码:
    1.我们首先看没有用到单例模式的案例

      class Program
        {
            static void Main(string[] args)
            {
                TestClass test1 = new TestClass();
                test1.TestMethod();
    
                TestClass test2 = new TestClass();
                test2.TestMethod();
    
                Console.Read();
            }
        }
    
        public class TestClass
        {
            /// <summary>
            /// 构造方法
            /// </summary>
            public TestClass()
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString() + "  TestClass()构造方法开始执行时间");
                //需要访问其他资源。。。会耗费时间。。。
                System.Threading.Thread.Sleep(2000);
            }
    
            public void TestMethod()
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString() + "   TestMethod()方法执行时间");
            }
        }
    

    我们简单的看一下运行出来的效果两个同时调用时就会调用2次构造方法,会给程序带来负担
    在这里插入图片描述
    2.我们接下来看使用了单利模式的例子

    class Program
        {
            static void Main(string[] args)
            {
                TestClass test1 = TestClass.GetInstance();
                test1.TestMethod();
    
                TestClass test2 = TestClass.GetInstance();
                test2.TestMethod();
    
                Console.Read();
            }
        }
        public class TestClass
        {
            //【1】创建一个私有的静态成员变量,用来保存当前的实例
            private static TestClass instance;
    
            /// <summary>
            /// 【2】私有化构造方法:避免外界直接new这个类的实例
            /// </summary>
            private TestClass()
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString() + "  TestClass()构造方法开始执行时间");
                //需要访问其他资源。。。会耗费时间。。。
                System.Threading.Thread.Sleep(2000);
            }
    
            //【3】创建一个让外界能够获取到的实例方法
            public static TestClass GetInstance()
            {
                if (instance == null)
                {
                    instance = new TestClass();
                }
                return instance;
            }
    

    我们给定了一个约束,创建了一个私有制的静态变量,并对方法直接判断避免了多次进入这个实例,我们接下来看看运行出来的效果:
    在这里插入图片描述
    由此可以单例模式避免了同时NEW了几个对象执行了实例,保证了只有一个实例,而不会被重复创建
    3.接下来我们加上多线程试一试:

    class Program
        {
            static void Main(string[] args)
            {
                Task.Factory.StartNew(() =>
                {
                    var test1 = TestClass.GetInstance();
                    test1.TestMethod();
                });
    
                Task.Factory.StartNew(() =>
                {
                    var test2 = TestClass.GetInstance();
                    test2.TestMethod();
                });
    
                Console.Read();
            }
        }
        public class TestClass
        {
            //【1】创建一个私有的静态成员变量,用来保存当前的实例
            private static TestClass instance;
    
            /// <summary>
            /// 【2】私有化构造方法:避免外界直接new这个类的实例
            /// </summary>
            private TestClass()
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString() + "  TestClass()构造方法开始执行时间");
                //需要访问其他资源。。。会耗费时间。。。
                System.Threading.Thread.Sleep(2000);
            }
    
            //【4】创建一个静态只读的辅助对象(就是为了lock使用)
            private static readonly object helperObject = new object();
    
            //【3】创建一个让外界能够获取到的实例方法
            public static TestClass GetInstance()
            {
                if (instance == null)
                {
                    lock (helperObject)
                    {
                        if (instance == null)
                        {
                            instance = new TestClass();
                        }
                    }
                }
                return instance;
            }
    
            public void TestMethod()
            {
                Console.WriteLine(DateTime.Now.ToLongTimeString() + "   TestMethod()方法执行时间");
            }
        }
    

    首先我们先New2个线程方法,然后我们在下面的方法里面加了个双重绑定,完全的杜绝了

    五、结尾

    【每天进步一点】会一直陪着大家一起进步,共同学习,希望大家早日成为大佬!!
    后面讲C#设计模式(二)简单工厂~
    欢迎大家留言,我有什么错误都可以指出来,一起学习。。

  • 相关阅读:
    Oracle EXP-00091解决方法
    Oracle 表空间的概念
    每天一点点oracle
    ntp服务问题
    Centos 7.4 安装samba服务
    Oracle group by
    Ansible介绍
    Gitlab应用——开发人员fetch分支,合并到master主分支申请
    Gitlab应用——系统管理
    Gitlab安装配置管理
  • 原文地址:https://www.cnblogs.com/LJF111/p/12304837.html
Copyright © 2020-2023  润新知