博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
阅读量:5051 次
发布时间:2019-06-12

本文共 3426 字,大约阅读时间需要 11 分钟。

之前的文章中介绍的和有一些问题。

存在的问题:

  • 只要继承了单例的模板就无法再继承其他的类。

虽然单例继承其他类是比较脏的设计,但是难免会遇到不得不继承的时候。没有最好的设计,只有最合适的设计。

解决方案:

  • 首先实现单例的类从使用方式上应该不变,还是 XXX.Instance.ABCFunc()

之前的单利的模板代码如下所示:

```
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

///

/// 1.泛型
/// 2.反射
/// 3.抽象类
/// 4.命名空间
///
namespace QFramework {
public abstract class QSingleton where T : QSingleton
{
protected static T mInstance = null;

protected QSingleton()    {    }    public static T Instance    {        get {            if (mInstance == null) {                // 先获取所有非public的构造方法                ConstructorInfo[] ctors = typeof(T).GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic);                // 从ctors中获取无参的构造方法                ConstructorInfo ctor = Array.Find (ctors, c => c.GetParameters ().Length == 0);                if (ctor == null)                    throw new Exception ("Non-public ctor() not found!");                // 调用构造方法                mInstance = ctor.Invoke (null) as T;            }            return mInstance;        }    }    public void Dispose()    {        mInstance = null;    }}

}

```

按照以前的方式,如果想实现一个单例的代码应该是这样的:

using QFramework;  // 1.需要继承QSingleton。// 2.需要实现非public的构造方法。public class XXXManager : QSingleton
{ private XXXManager() { // to do ... }}public static void main(string[] args) { XXXManager.Instance().xxxyyyzzz();}

如果我想XXXManager继承一个BaseManager代码就变成这样了

using QFramework;  // 1.需要继承QSingleton。// 2.需要实现非public的构造方法。public class XXXManager : BaseManager {      private XXXManager() {        // to do ...    }}public static void main(string[] args)  {    XXXManager.Instance().xxxyyyzzz();}

这样这个类就不是单例了,怎么办?

答案是通过C#的属性。

using QFramework;  // 1.需要继承QSingleton。// 2.需要实现非public的构造方法。public class XXXManager : BaseManager {      private XXXManager() {        // to do ...    }    public static XXXManager Instance {         get {            return QSingletonComponent
.Instance; } }}public static void main(string[] args) { XXXManager.Instance().xxxyyyzzz();}

好了,又看到陌生的东西了,QSingletonComponent是什么?

和之前的单例的模板很相似,贴上代码自己品吧...

using System;using System.Collections.Generic;using System.Text;using System.Reflection;/// /// 组合方式实现单例子/// namespace QFramework {    ///     /// class是引用类型    ///     public class QSingletonComponent
where T : class { protected static T mInstance = null; public static T Instance { get { if (mInstance == null) { // 先获取所有非public的构造方法 ConstructorInfo[] ctors = typeof(T).GetConstructors (BindingFlags.Instance | BindingFlags.NonPublic); // 从ctors中获取无参的构造方法 ConstructorInfo ctor = Array.Find (ctors, c => c.GetParameters ().Length == 0); if (ctor == null) throw new Exception ("Non-public ctor() not found!"); // 调用构造方法 mInstance = ctor.Invoke (null) as T; } return mInstance; } } public static void Dispose() { mInstance = null; } }}

这样无法继承的问题就解决啦。

缺点是:相比于QSingleton,QSingletonComponent在使用时候多了一次函数调用,不过做中小型项目应该可以应付了。

介绍完毕,睡觉了。。。

欢迎讨论!

附:

转载请注明地址:

微信公众号:liangxiegame

output/writing/unity游戏框架搭建

转载于:https://www.cnblogs.com/liangxiegame/p/Unity-you-xi-kuang-jia-da-jian-shi-san-wu-xu-ji-ch.html

你可能感兴趣的文章
log4net介绍及使用
查看>>
CMS:文章管理之视图(3)
查看>>
清北学堂的小技巧和小收获
查看>>
模型压缩方向一个很牛的paper
查看>>
Android--AsyncTask异步加载详解
查看>>
YARN学习总结
查看>>
C#基础温习(2):温习控制台程序(二)
查看>>
一些文章
查看>>
注解@ResponseBody的作用
查看>>
java main函数不执行?
查看>>
iOS 更好用的打Log方式-显示文件名、行数
查看>>
从MS SQL删除大数据说开去
查看>>
NOVO SOP (SOP简介及历史)
查看>>
获取JNDI数据源
查看>>
java听课笔记(十)
查看>>
flash与字符串:替换表情
查看>>
Docker常用命令
查看>>
windows7+docker添加php扩展
查看>>
[UE4]多播代理实例
查看>>
开奖计算---五星直选复式
查看>>