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

概述

原型模式是一种创建型设计模式,它允许通过复制一个现有的对象来创建新的对象,而无需知道具体的创建细节。

原型模式的工作原理是:提供一个原型实例,当需要创建新对象时,可以通过请求这个原型实例拷贝它自己来实现创建。这样,新创建的对象将具有与原型实例相同的属性和行为。

原型模式包含如下角色:

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

案例

简介接口

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

具体类

实现一个简历对象的创建、设置个人信息和克隆的功能。

定义一个名为Resume的类,该类实现了IResume接口。它包含了姓名、年龄和性别等个人信息的属性,并提供了相应的方法来设置和显示这些信息。

构造函数Resume(string name)用于初始化简历对象的姓名属性。

SetPersonInfo(int age, string sex)方法用于设置简历对象的年龄和性别属性。

Display()方法用于打印简历对象的姓名、年龄和性别信息。

Clone()方法用于克隆简历对象,通过调用MemberwiseClone()方法实现浅拷贝,并将返回的对象转换为Resume类型。

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对象的年龄进行更改,这段代码展示了原型模式的特点,即通过复制现有对象来创建新对象,而不是通过构造函数进行初始化。这样可以避免重复的初始化过程,提高性能,并且可以方便地修改新对象的部分属性。

    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();
    }

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

// 测试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. 必须维护对克隆对象的正确性,特别是在运行时状态变化时。

原型模式的使用场景:

  • 资源消耗较多:当类的初始化过程需要消耗大量资源,例如内存或硬件资源,使用原型模式可以通过克隆已存在的对象来避免重复的初始化开销。
  • 初始化繁琐耗时:如果对象的创建需要进行复杂的计算或频繁地与本地资源(如数据库、文件)交互,使用原型模式可以节省CPU和时间资源。
  • 构造函数复杂:当类的构造函数复杂,或者需要在运行时动态地创建新对象而不希望使用构造函数时,原型模式提供了一种替代方案。
  • 实例对象数量庞大:在内存中需要循环创建大量相似对象时,可以利用原型模式复用现有对象来创建新对象,这样可以提高创建效率并减少资源消耗。
  • 部分属性修改:当需要创建一个与现有对象具有相同状态的新对象,并且这些状态可以独立修改时,原型模式是一种有效的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃香蕉的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值