当前位置:   article > 正文

Unity设计模式——原型模式_unity memberwiseclone

unity memberwiseclone

Unity设计模式——原型模式

Brief

原型模式是一种创造性模式,它通过复制一个已有对象来获取更多相同或者相似地对象。原型模式可以提高相同类型对象的创造效率,简化创建流程。

具体不展开,本篇主旨是在Unity中实现与演示命令模式,有关原型模式的详细介绍可以看:

[Refactoring.Guru](原型设计模式 (refactoringguru.cn))

Let’s see the source code

原型模式应用很广,以至于

  • 在.Net框架中,就提供了[Object.MemberwiseClone()](Object.MemberwiseClone 方法 (System) | Microsoft Learn) 方法可用于实现浅克隆。

    Person other = (Person) this.MemberwiseClone();
    
    • 1
  • 在.Net框架中中,还提供了[ICloneable()](ICloneable 接口 (System) | Microsoft Learn)接口可用于实现深克隆。

    Person other = (Person) this.Clone();// notice:要先实现ICloneable接口()
    
    • 1
    ===========================================================*/
    namespace System {
      
      using System;
      // Defines an interface indicating that an object may be cloned.  Only objects 
      // that implement ICloneable may be cloned. The interface defines a single 
      // method which is called to create a clone of the object.   Object defines a method
      // MemberwiseClone to support default clone operations.
      // 
      [System.Runtime.InteropServices.ComVisible(true)]
      public interface ICloneable
      {
          // Interface does not need to be marked with the serializable attribute
          // Make a new object which is a copy of the object instanced.  This object may be either
          // deep copy or a shallow copy depending on the implementation of clone.  The default
          // Object support for clone does a shallow copy.
          // 
          Object Clone();
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    所以你没必要像一些其他语言一样再去实现一个ICloneable接口。

    看看UnityCSReference里怎么使用它:

        public abstract class PlayableBehaviour : IPlayableBehaviour, ICloneable
      {
          // 省略.....
    
          public virtual object Clone()
          {
              return MemberwiseClone();
          }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

此外,如果你有用过Unity,你应该能想到这个API:Object.Instantiate

public static Object Instantiate (Object original);
  • 1

喏,这不就是原型模式的应用吗?接收Object original返回一个克隆的Object。

很可惜这一部分代码在C++端(毕竟Unity的对象主要就是C++对象)没法直接看,不过幸运的是在[Unity设计模式与游戏开发]原型模式 | Aladdin的博客 (dingxiaowei.cn)中找到了对应的代码。

原型模式优缺点

优点

  • 你可以克隆对象, 而无需与它们所属的具体类相耦合。
  • 你可以克隆预生成原型, 避免反复运行初始化代码。
  • 你可以更方便地生成复杂对象。
  • 你可以用继承以外的方式来处理复杂对象的不同配置。

缺点

  • 克隆包含循环引用的复杂对象可能会非常麻烦。(若对象之间存在多重的嵌套引用,为了实现深克隆,每一层对象的类都必须支持深克隆)

Code

代码演示了如何使用ICloneable实现深复制,如何使用MemberwiseClone实现浅复制。
以及引用传递和值传递的区别。

特别注意的是:
对于对象语句类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值直接复制一份给新对象。
对于数据类型是引用类型的成员变量,那么浅拷贝会进行引用传递。请添加图片描述图片请添加图片描述

see:https://github.com/nickpansh/Unity-Design-Pattern

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/83032
推荐阅读
相关标签
  

闽ICP备14008679号