【每天进步一点】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#设计模式(二)简单工厂~
欢迎大家留言,我有什么错误都可以指出来,一起学习。。

posted @ 2019-12-19 00:40  Skrr  阅读(165)  评论(0编辑  收藏  举报