• 创作型---原型模式(C# ICloneable接口的实现)


    在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用。 然而这个思路正是原型模式的实现方式。下面就具体介绍下设计模式中的原型设计模式。

    代码:

    public interface ICloneable
        {
            object Clone();
        }
    
        [Serializable]
        public class Department
        {
    
        }
    
        [Serializable]
        class Employee : ICloneable
        {
            public string IDCode { get; set; }
            public int Age { get; set; }
            public Department Department { get; set; }
    
            #region ICloneable 成员
    
            /// <summary>
            /// 浅拷贝
            /// </summary>
            /// <returns></returns>
            public object Clone()
            {
                return this.MemberwiseClone();
            }
    
            #endregion
            /// <summary>
            /// 深拷贝
            /// </summary>
            /// <returns></returns>
            public Employee DeepClone()
            {
                using (Stream objectStream = new MemoryStream())
                {
                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(objectStream, this);
                    objectStream.Seek(0, SeekOrigin.Begin);
                    return formatter.Deserialize(objectStream) as Employee;
                }
            }
    
            public Employee ShallowClone()
            {
                return Clone() as Employee;
            }
        }
    View Code

    原型模式的优缺点

    原型模式的优点有:

    1. 原型模式向客户隐藏了创建新实例的复杂性
    2. 原型模式允许动态增加或较少产品类。
    3. 原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。
    4. 产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构

    原型模式的缺点有:

    1. 每个类必须配备一个克隆方法
    2.  配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
  • 相关阅读:
    比赛排名机制
    Python 异常(Exception)
    Python 异常(Exception)
    Sobel算子及C++实现
    一题多解(一) —— list(Python)判空(以及 is 与 == 的区别)
    常用软件的常用快捷键
    常用软件的常用快捷键
    从队列、二叉树到优先队列
    Jenkins(二)
    AssertValid函数学习
  • 原文地址:https://www.cnblogs.com/scmail81/p/8684478.html
Copyright © 2020-2023  润新知