zoukankan      html  css  js  c++  java
  • Unity3D中的单例模式

    一、C#下的单例模式

    C#实现单例模式首先要看C# in Depth的一章Implementing the Singleton Pattern in C#

    下面是链接:
    http://csharpindepth.com/Articles/General/Singleton.aspx
    介绍了Lazy和不Lazy的区别,线程安全。


    下面是一个中文的更详细的解释说明
    http://www.cnblogs.com/rush/archive/2011/10/30/2229565.html

    其他文章基本上就是这些东西翻来覆去的讲,没有更多新意了,包括MSDN的文章。


    二、怎么样不重复写代码

    1)使用泛型

    单例作为一个构造模式,实际上有两个要求
    a)不能通过new关键字进行构造,只能通过GetInstance()获取实例。 (构造函数加private)
    b)不能继承 (类加sealed)

    而如果使用泛型,并且通过new关键字构造这个类,那这个类就必须要有一个公共的构造函数。这和单例模式是矛盾的。
    一定要处理这个问题的话一个办法是使用反射。

    但同样,如果能使用反射获得这个类的实例,那么整个单例模式都没什么意义,任何人总能获取到这个类的实例,所以还是不要自欺欺人了,就把构造函数公开出来算了。

    https://www.codeproject.com/tips/696330/thinking-in-singleton-instead-of-a-useful-generic
    一个使用反射实现的单例

    2)使用Code Snippet功能
    这确实也是一个解决方案,就看你是否可以忍受大量看起来重复的代码了。
    https://stackoverflow.com/questions/380755/a-generic-singleton


    三、Unity3D下的单例模式
    Component创建实例的方法多了AddComponent(泛型或者非泛型版本)。

    当然还有一些其他的可能,比如加载Prefab,加载场景等等。
    要保证Component的唯一,一般在Start或者Awake的时候检查instance,并且将多余的实例销毁掉。

    当然,我并不觉得有什么必要,甚至觉得不应该将Component作为单例。

    代码可以参考:
    http://wiki.unity3d.com/index.php/Singleton
    https://unity3d.com/cn/learn/tutorials/projects/2d-roguelike-tutorial/writing-game-manager

    四、单例模式的讨论

    Game Programming Patterns - Singleton

    http://gameprogrammingpatterns.com/singleton.html

    http://gpp.tkchu.me/singleton.html (翻译版)

    附:一个例子

        public class Singleton<T> where T : class, new()
        {
            protected Singleton()
            {
            }
    
            public static T Instance
            {
                get { return SingletonCreator.Instance; }
            }
    
            private static class SingletonCreator
            {
                static SingletonCreator()
                {
                }
    
    // ReSharper disable once StaticFieldInGenericType
    // ReSharper disable once MemberHidesStaticFromOuterClass
                internal static readonly  T Instance = new T();
            } 
        }

    代码来自于:Implementing the Singleton Pattern in C# - Fifth version - fully lazy instantiation

    目前的Unity(5.6)并不支持Lazy。

    用法1:
    Singleton<C>.Instance.Method();

    用法2:
    class C : Singleton<C>
    {
        //......
    }

    C.Instance.Method();

  • 相关阅读:
    Mac Pro 日历增强工具 Itsycal
    Linux/CentOS 搭建 SVN 项目
    常用“开发软件包“下载地址
    修复 ThinkPHP3.2.3 抛出异常模块的一个BUG,关闭字段缓存功能
    升级到 PHP-7 遇到的坑 及 经验分享
    Mac Pro 实现 PHP-5.6 与 PHP-7.0 等多版本切换
    如何 实现PHP多版本的 共存 和 切换?
    记 Mac Pro 系统升级后,编译安装 PHP-5.6.28 / PHP-7.0 报错修复过程
    ASCII码表
    用C语言,如何判断主机是 大端还是小端(字节序)
  • 原文地址:https://www.cnblogs.com/yusjoel/p/7151449.html
Copyright © 2011-2022 走看看