原型 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没有发生变化,说明复制成功。
在使用该模式时注意深拷贝和浅拷贝。