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

原型 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没有发生变化,说明复制成功。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值