c#设计模式-创建型模式 之 原型模式

概述

原型模式是一种创建型设计模式,它允许你复制已有对象,而无需使代码依赖它们所属的类。新的对象可以通过原型模式对已有对象进行复制来获得,而不是每次都重新创建。

原型模式包含如下角色:

  1. 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。
  2. 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  3. 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

案例

简介接口

cs 复制代码
public interface IResume
{
    //填写资料
    void SetPersonInfo(int age, string sex);
    //打印资料
    void Display();
    //克隆方法
    object Clone();
}

具体类

cs 复制代码
public class Resume : IResume
{
    private string name;
    private int age;
    private string sex;

    // 构造函数:初始化姓名
    public Resume(string name)
    {
        this.name = name;
    }

    // 填写个人信息
    public void SetPersonInfo(int age, string sex)
    {
        this.age = age;
        this.sex = sex;
    }

    //打印
    public void Display()
    {
        Console.WriteLine("姓名:" + name);
        Console.WriteLine("年龄:" + age + ",性别:" + sex);
    }

    // 克隆该实例
    public object Clone()
    {
        return MemberwiseClone() as Resume;
    }
}

测试

模拟创建了一份阿豪的简介,克隆给B对象,并对B对象的年龄进行更改

cs 复制代码
    public static void Main(string[] args)
    {
        //创建原型A对象
        Resume a = new Resume("阿豪");
        a.SetPersonInfo(18, "男");

        //克隆给B对象
        Resume b = a.Clone() as Resume;
        //修改B对象的内容
        b.SetPersonInfo(20, "男");

        Console.WriteLine("----------------A--------------");
        a.Display();
        Console.WriteLine("----------------B--------------");
        b.Display();
    }

再来对比一下克隆的对象与原对象

cs 复制代码
// 测试A==B?
// 对任何的对象x,都有x.clone() !=x,即克隆对象与原对象不是同一个对象
Console.Write("A==B ? ");
Console.WriteLine(a == b);

// 对任何的对象x,都有x.clone().GetType()==x.GetType(),即克隆
Console.Write("A.GetType()==B.GetType() ? ");
Console.WriteLine(a.GetType() == b.GetType());

总结

原型模式的优点:

  1. 原型模式在内存中复制对象,不会调用类的构造函数,性能优良。
  2. 简化了创建过程。在类初始化需要消耗非常多的资源的情况下,可以通过复制原型避免重复的初始化过程。
  3. 可以避免构造函数的约束。复制一个已存在的实例可以很好地保持现有实例的数据。
  4. 增加或减少产品类非常方便。客户端不需要因为创建者的更改而更改。

原型模式的缺点:

  1. 需要对每一个类都配置一个 clone 方法
  2. clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
  3. 当实现深拷贝时需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深拷贝,每一层都要提供深拷贝的实现方法。
  4. 必须维护对克隆对象的正确性,特别是在运行时状态变化时。
相关推荐
西门啐血4 小时前
上位机开发之假装有设备,使用 C# 模拟串口设备
开发语言·mongodb·c#
丙氨酸長鏈5 小时前
[Bukkit插件开发]手持发射器箭矢机枪 教学文档 面向Python/C#开发者入门Java与Bukkit API
java·python·c#
Nontee5 小时前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
淡海水5 小时前
12-01-YooAsset工程化-Unity资源管理规范
unity·c#·游戏引擎·yooasset
脚踏实地皮皮晨6 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
caishenzhibiao7 小时前
降雨带波段点差 同花顺期货通指标
java·c语言·c#
半夢半醒17 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加菱形、平行四边形、圆角矩形,文本居中显示
算法·c#·流程图
choumin7 小时前
行为型模式——模板方法模式
c++·设计模式·模板方法模式·行为型模式
啦啦啦啦啦zzzz9 小时前
设计模式:建造者模式
c++·设计模式·建造者模式
蓝斯49710 小时前
C# 调用邮箱应用发送带附件的邮件
网络·c#·github