首页 > 其他分享 >单例模式(Singleton Pattern)——游戏开发常用设计模式(一)

单例模式(Singleton Pattern)——游戏开发常用设计模式(一)

时间:2025-01-13 21:54:46浏览次数:1  
标签:Singleton MonoBehaviour Pattern 模式 instance static 单例 设计模式 public

前言

单例模式应该是在unity游戏开发中最简单最常用的设计模式之一,无论是管理全局游戏状态、处理资源加载,还是控制音频播放,单例模式都能为我们提供一个简洁的解决方案——确保一个类只有一个实例,并允许在游戏的任何地方轻松访问它。

然而,这种便利性也伴随着潜在的风险,比如代码耦合度增加、测试难度提升,甚至可能引发难以调试的多线程问题。

本文记录了我在学习单例模式中总结的重点和实用方法
本文脚本均为基于unity的C#脚本

一、简介

1.概念

单例模式是一种设计模式,它通过限制类的实例化过程,确保在整个应用程序生命周期中只有一个实例存在,并提供一个全局访问点以便在代码的任何地方都能方便地使用这个唯一实例。应用在Unity里面,可以用来作为数据类、工具类、实现类,方便脚本调用。

2.优缺点

优点:

  1. 它确保一个类只有一个实例,避免了重复创建对象的开销,从而节省了系统资源;
  2. 单例模式提供了一个全局访问点,使得在程序的任何地方都能方便地访问这个实例。
  3. 单例模式能简化代码结构,减少因多实例管理带来的复杂性。
    缺点:
  4. 单例模式可能导致代码的耦合度增加,因为全局访问的特性使得其他类直接依赖于单例,降低了代码的可测试性和可维护性;
  5. 单例模式在多线程环境下可能引发线程安全问题,需要额外的同步机制来保证实例的唯一性;
  6. 单例的生命周期通常与应用程序一致,如果设计不当,可能会导致资源无法及时释放,从而引发内存泄漏等问题。

3.分类

单例模式分为饿汉式和懒汉式两种:

  1. 饿汉式单例模式:在程序一开始的时候就创建了单例对象。但这样一来,这些对象就会在程序一开始时就存在于内存之中,占据着一定的内存。
  2. 懒汉式单例模式:在用到单例对象的时候才会创建单例对象。

在使用unity进行游戏开发时,单例模式的实现方式又分为继承MonoBehaviour不继承MonoBehaviour

二、代码实现

1.继承MonoBehaviour的单例模式

写法一

可将此脚本挂载在任意对象上

public class UnitySingleton : MonoBehaviour{
	static UnitySingleton instance;
	public static UnitySingleton Instance {
		get{
			if(instance == null){
				instance = GameObject.FindObjectOfType(typeof(UnitySingleton)) as UnitySingleton ;
			}
			return instance;
		}
	}
}

写法二

这是一种更容易理解的写法,需要将此脚本挂载在单例对象上

public class UnityManager : MonoBehaviour{
	public static UnityManager Instance;
	void Awake(){
		if(instance == null){
			intstance = this;
		}
		else{
			Destory(gameObject);
		}
	}
}

写法三

切换场景不销毁单例对象

public class TestUI : MonoBehaviour 
{
    //定义私有的构造方法,防止外部实例化对象
    private Test(){}

    private static Test instance;
    public static Test Instance { 
        get { 
            //保证对象的唯一性
            if (instance == null){
                instance = FindObjectOfType<Test>();
                if(instance == null){
                    GameObject go = new GameObject("Test");//创建游戏对象
                    instance = go.AddComponent<Test>();//挂载脚本到游戏对象
                }
                DontDestroyOnLoad(instance);//创建不销毁的对象
            }
            
            return instance; 
        } 
    }
}

2.不继承MonoBehaviour的单例模式

public class Singleton{
	static Singleton instance;
	public static Singleton Instance{
		get {
			if (instance == null) {
				instance = new Singleton();
			}
		return instance;
		}
	}
}

还有一种泛型单例基类的写法,可以提高代码复用率,因为我暂时用不到,现在这里留个坑,等以后用到了再回来补上。泛型基类的写法在这篇文章里有详细教程:【unity框架开发1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写_unity继承monobehaviour单例模式-CSDN博客

3.使用方法

以上写法均可使用 [ 类名.Instance.---- ] 进行访问

三、总结

单例虽然方便,但如果我们在一个项目中 过度使用单例模式,就会造成该项目的 耦合性非常高,一个单例中的某个变量,可能同时被十几个对象引用,导致牵一发而动全身,使得项目难以维护。

在使用unity进行游戏开发的过程中,使用单例时需要注意:

如果其它脚本与单例有依赖关系,且单例中有初始化代码在Awake或者Start方法中执行,最好手动控制单例的初始化顺序。因为在unity中多个脚本间的Start方法和Awake方法是以随机顺序进行的,手动控制单例的初始化顺序以防止空引用异常。

标签:Singleton,MonoBehaviour,Pattern,模式,instance,static,单例,设计模式,public
From: https://www.cnblogs.com/CloverJoyi/p/18669500

相关文章

  • C#中的设计模式:构建更加优雅的代码
    C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发......
  • C#中的设计模式:构建更加优雅的代码
    C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发......
  • 设计模式——工厂模式
    工厂模式实现工厂模式的方法前置条件简单工厂模式(SimpleFactory)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)应用场景总结工厂模式(FactoryPattern)是软件工程中的一种创建型设计模式。使用工厂模式可以将对象的创建与使用分离,也就是说,客户端代码不......
  • 设计模式——单例模式
    单例模式实现单例模式的方法前置条件懒汉式(LazyInitialization)饿汉式(EagerInitialization)双重锁式(Double-CheckedLocking)静态内部类式(StaticInnerClass)枚举式(Enum)总结单例模式(SingletonPattern)是软件工程中的一种设计模式,它确保一个类只有一个实例,并提供一个全......
  • [PCIE5.0] 4.2.8 Compliance Pattern in 8b/10b Encoding
    这段文字描述的是在PCIe或类似高速接口协议中,Polling.Compliance子状态的具体要求,特别是合规模式(CompliancePattern)在传输过程中的处理方式。这个过程主要是通过SKPOrderedSet来验证链路的合规性,确保链路在高频率下的稳定性、可靠性和时序准确性。我们来逐步解读这......
  • Java常用设计模式
    单例模式单例模式就是:在程序运行期间,某些类有且最多只有一个实例对象饿汉模式(静态常量)饥饿模式又称为饿汉模式,指的是JVM在加载类的时候就完成类对象的创建//饿汉式(静态常量)publicclassSingleton1{//构造器私有化,外部不能newprivateSingleton1(......
  • 【设计模式与体系结构】结构型模式-外观模式
    引言昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。————《木兰诗节选》花木兰替父从军,欲买马、鞍鞯、辔头和长鞭,需要分别去往东市、西市、南市和北市。换言之,花木兰一人就得与四个贸易......
  • 观察者设计模式:原理、应用与对比分析
    引言在软件工程中,设计模式是解决常见问题的经典方案。观察者设计模式(ObserverPattern)是一种行为型设计模式,用于在对象间建立一种一对多的依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。本文旨在探讨观察者模式的基本原理、应用场景、具体案例,并与其......
  • 【设计模式与体系结构】创建型模式-原型模式
    简介原型模式(PrototypePattern)指的是用一个已经创建的对象作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。原型模式的角色抽象原型类:规定具体原型对象必须实现的\(clone()\)方法具体原型类:实现抽象原型类的\(clone()\)方法,它是可被复制的对象访问类:使用......
  • 设计模式--迭代器模式【行为型模式】
    设计模式的分类我们都知道有23种设计模式,这23种设计模式可分为如下三类:创建型模式(5种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式(11种):策略......