设计模式——原型(Unity3D中应用)

    xiaoxiao2025-04-13  13

    原型 Prototype 对象间数据拷贝(深拷贝,浅拷贝) 原型模型目的是为了Copy对象。 浅拷贝:值类型数据拷贝 深拷贝:引用类型数据拷贝

    public class WordDocument { public string Text{ get; set;} public Diagram diagram{ get; set;} } public class Diagram { public string Data{ get; set;} } public class Test: MonoBehaviour { private void Start () { WordDocument document1 = new WordDocument (); document1.Text = "WordDocument"; Diagram diagram = new Diagram(); document1.diagram = diagram; WordDocument document2 = new WordDocument (); document2.Text = document1.Text; document2.diagram = document2.diagram; } }

    此时发现Copy一份对象需要调用者去做创建任务,使用十分不方便。我们应该将对象的创建工作交由提供者创建。

    public class WordDocument : ICloneable { public string Text{ get; set;} public Diagram diagram{ get; set;} public object Clone () { WordDocument wordDocument = new WordDocument (); wordDocument.Text = Text; wordDocument.diagram = diagram; return wordDocument; } } public class Prototype : MonoBehaviour { private void Start () { WordDocument document1 = new WordDocument (); document1.Text = "WordDocument1"; Diagram diagram = new Diagram(); diagram.Data = "diagram1"; document1.diagram = diagram; WordDocument document2 = document1.Clone () as WordDocument; document2.Text = "diagram1"; document2.diagram.Data = "diagram2"; print (document1.Text); print (document1.diagram.Data); } }

    经过改造调用者复制对象就变得非常简单,复杂的Copy工作交由提供者完成。 运行结果发现:document1 的diagram发生改变,修改了document2的diagram,问什么会影响document1的diagram?因为复制时,只是复制了diagram的引用,实际document1和document2共用一个diagram。这就需要深拷贝。

    对Diagram也实现IClineable:

    public class Diagram : ICloneable { public string Data{ get; set;} public object Clone () { Diagram diagram = new Diagram (); diagram.Data = Data; return diagram; } } public class WordDocument : ICloneable { public string Text{ get; set;} public Diagram diagram{ get; set;} public object Clone () { WordDocument wordDocument = new WordDocument (); wordDocument.Text = Text; Diagram diagramCopy = diagram.Clone () as Diagram; wordDocument.diagram = diagramCopy; return wordDocument; } }

    运行结果发现document1的diagram没有发生变化,说明复制成功。

    在使用该模式时注意深拷贝和浅拷贝。

    转载请注明原文地址: https://ju.6miu.com/read-1298019.html
    最新回复(0)