C# 语法五 单例类、单例模式

1.优点

只有一个实例

2.缺点

a)这个实例不能随时释放掉,占用资源。

b)每次使用,都要判断是否为空,增加消耗

3.适用场景

只能有一个实例的业务场景,例如:数据库连接对象(每次连接都是同一个连接)、打印(多次打印,但同时只能一个在打印)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    /// <summary>
    /// 第一种:经典模式,每次都判空,增加消耗,这是缺点
    /// </summary>
    public class ClassStaticTest
    {
        private static ClassStaticTest instance;

        private ClassStaticTest()
        {
        }

        public static ClassStaticTest GetInstance()
        {
            if (instance == null)
            {
                instance = new ClassStaticTest();
            }

            return instance;
        }

        public int Age { get; set; }
        public string Name { get; set; }

        public void DoSome()
        {
            Console.WriteLine(Age);
            Console.WriteLine(Name);
        }

    }


    /// <summary>
    /// 第二种:多线程安全
    /// </summary>
    public class ClassStaticTest2
    {
        private static object obj = new object();
        private static ClassStaticTest2 instance;

        private ClassStaticTest2()
        {
        }

        public static ClassStaticTest2 GetInstance()
        {
       //双重加锁
if (instance == null) { lock (obj) { if (instance == null) { instance = new ClassStaticTest2(); } } } return instance; } public int Age { get; set; } public string Name { get; set; } public void DoSome() { Console.WriteLine(Age); Console.WriteLine(Name); } } /// <summary> /// 第三种:CLR解决线程安全,当没有用到该类时,实例都存在,这是缺点 /// </summary> public class ClassStaticTest3 { private static readonly ClassStaticTest3 instance = new ClassStaticTest3(); private ClassStaticTest3() { } public static ClassStaticTest3 GetInstance() { return instance; } public int Age { get; set; } public string Name { get; set; } public void DoSome() { Console.WriteLine(Age); Console.WriteLine(Name); } } }
天生我材必有用,千金散尽还复来
原文地址:https://www.cnblogs.com/ligenyun/p/7840770.html