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);
}
}
}
0 条评论