vlambda博客
学习文章列表

C#设计模式——原型模式

This browser does not support music or audio playback. Please play it in WeChat or another browser.
C#设计模式——原型模式


我希望未来有一天,因为我的代码,让这个世界上的一些人生活的更便利
感觉到一点点幸福或愉悦。不管这些人多还是少。

前言


原型模式是创建型模式,用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。创建的方式有两种:深拷贝和浅拷贝。两种拷贝方式具体请参考:

C#设计模式——原型模式
C#设计模式——原型模式

方案思路


此模式内容也比较简单,也是一个比较特殊的模式,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,下面就用克隆人来进一步说明。

C#设计模式——原型模式
C#设计模式——原型模式

Code




以下代码经过测试,可直接在项目中使用

/// <summary>

 /// 测试类

 /// </summary>

public class clone : MonoBehaviour {

void Start () {

        Person person0 = new Person("j", 22);

        person0.SetClothing(1000, 32);

        person0.Show();

        //浅拷贝测试

        Person person1 = person0.ShallowCopy();

        person1.Show();

        person1.SetAge(0);

        person1.SetClothing( 9999,40);

        person0.Show();

        person1.Show();

        //深拷贝测试

        Person person2 = person0.DeepCopy();

        person2.Show();

        person2.SetAge(99);

        person2.SetClothing(100099, 55);

        person0.Show();

        person1.Show();

        person2.Show();

    }

}

 /// <summary>

 /// 人穿的衣服

 /// </summary>

[Serializable]

public class Clothing

{

    public int money;

    public int size;

}

/// <summary>

/// 人

/// </summary>

[Serializable]

public class Person:CopyBase<Person>

{

    string name;

    int age;

    Clothing clothing;

    public Person(string name, int age)

    {

        this.name = name;

        this.age = age;

        clothing = new Clothing();

    }

    public void SetName(string name)

    {

        this.name = name;

    }

    public void SetAge(int age)

    {

        this.age = age;

    }

    public void SetClothing(int money,int size)

    {

        this.clothing.money = money;

        this.clothing.size = size;

    }

    public void Show()

    {

        Debug.Log(name + "-----" + age + "-----" + clothing.money + "-----" + clothing.size);

    }

}

/// <summary>

/// 深浅拷贝基类

/// </summary>

/// <typeparam name="T"></typeparam>

[Serializable]

public class CopyBase<T>

{

    /// <summary>

    /// 深拷贝

    /// </summary>

    /// <returns></returns>

    public virtual T DeepCopy()

    {

        MemoryStream memoryStream = new MemoryStream();

        BinaryFormatter formatter = new BinaryFormatter();

        formatter.Serialize(memoryStream, this);

        memoryStream.Position = 0;

        return (T)formatter.Deserialize(memoryStream);

    }

    /// <summary>

    /// 浅拷贝

    /// </summary>

    /// <returns></returns>

    public virtual T ShallowCopy()

    {

        return (T)this.MemberwiseClone();

    }

}







END




感谢阅读


你知道的越多,你不知道的越多

我是EAST

一个靠互联网苟且偷生的程序员

咱们下期见!





扫描二维码关注我吧