C# 自用设计模式模版 — 单例模式

using System;

namespace SingletonPattern
{
    /// <summary>
    /// 单例模式基类
    /// </summary>
    /// <typeparam name="T">要实现单例模式的类类型</typeparam>
    public abstract class SingletonBase<T> where T : SingletonBase<T>, new()
    {
        // 用于存储单例实例
        private static readonly Lazy<T> instance = new Lazy<T>(() => new T());

        /// <summary>
        /// 获取单例实例
        /// </summary>
        public static T Instance => instance.Value;

        // 保护构造函数,防止外部实例化
        protected SingletonBase()
        {
            if (instance.IsValueCreated)
            {
                throw new InvalidOperationException("不能创建单例类的另一个实例。");
            }
        }

        /// <summary>
        /// 初始化单例实例的方法,可以由派生类重写
        /// </summary>
        protected virtual void Initialize()
        {
            // 可由派生类实现
        }
    }

    /// <summary>
    /// 一个具体的单例类示例
    /// </summary>
    public class MySingleton : SingletonBase<MySingleton>
    {
        // 私有构造函数
        private MySingleton()
        {
            // 在这里可以放置初始化代码
        }

        // 可以重写初始化方法
        protected override void Initialize()
        {
            base.Initialize();
            // 在这里添加具体的初始化逻辑
        }

        // 示例方法
        public void DoSomething()
        {
            Console.WriteLine("MySingleton is doing something.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 获取单例实例并调用其方法
            MySingleton.Instance.DoSomething();
        }
    }
}

模板说明:

SingletonBase<T> 类

泛型基类,类型参数 T 约束为 SingletonBase<T> 的子类,并且必须具有一个无参数构造函数。

  • Lazy<T> 用于实现线程安全的延迟初始化。
  • Instance 属性提供对单例实例的全局访问。
  • 保护的构造函数防止外部类直接实例化该类。
  • Initialize 方法可以由派生类重写以执行初始化逻辑。

Unity版本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T :  MonoBehaviour
{
    private static T instance;

    public static T Instance
    {
        get
        {
            if(instance == null)
            {
                instance = FindObjectOfType<T>();
                if (instance == null)
                {
                    Debug.LogError("没有在场景中找到该类,该类的类名为:" + typeof(T).Name);
                    return null;
                }

            }
            return instance;
        }
    }

    private void Awake()
    {
        if (instance == null)
        {
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(instance);
        }
            
    }

}

分类: C#

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注