《C#设计模式》《原型模式》

一:案例场景

在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度。如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相应工厂类的增加,维护的代码维度增加了,因为有产品和工厂两个维度了,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适。由于每个类实例都是相同的,这个相同指的是类型相同,但是每个实例的状态参数会有不同,如果状态数值也相同就没意义了,有一个这样的对象就可以了。当我们需要多个相同的类实例时,可以通过对原来对象拷贝一份来完成创建,这个思路正是原型模式的实现方式。

二:概念定义 

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

三:案例解析

小明可能要去学习舞蹈,学习唱歌,学习游泳,但是好多动作同一个人不能同时进行 ,所以需要多个小明对象分别进行不同的动作,接下来看一下代码。

    /// <summary>
    ///  抽象原型,定义了原型本身所具有特征和动作
    /// </summary>
    public abstract class Prototype
    {
        public Prototype() { }
        public Prototype(Prototype prototype) { }
        public abstract void Dancing();
        public abstract void Sining();
        public abstract void Swimming();
        public abstract Prototype prototypeClone();
    }
    ///具体原型
    public sealed class XiaoMing : Prototype
    {
        public XiaoMing()
        { }
        public XiaoMing(Prototype prototype) : base(prototype)
        {

        }

        public override void Dancing()
        {
            throw new NotImplementedException();
        }

        public override void Sining()
        {
            throw new NotImplementedException();
        }
        public override void Swimming()
        {
            throw new NotImplementedException();
        }

        public override Prototype prototypeClone()
        {
            return (XiaoMing)this.MemberwiseClone();
        }
    }

客户端调用:

       public TestPrototype()
        {
            Prototype pro = new XiaoMing();
            Prototype pro1 = pro.prototypeClone();
            Prototype pro2 = pro.prototypeClone();
            pro.Dancing();
            pro1.Sining();
            pro2.Swimming();
            Console.Read();
        }

五:总结

Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。 
  Prototype模式对于“如何创建易变类的实体对象”(创建型模式除了Singleton模式以外,都是用于解决创建易变类的实体对象的问题的)采用“原型克隆”的方法来做,它使得我们可以非常灵活地动态创建“拥有某些稳定接口”的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后在任何需要的地方不断地Clone。 
  Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法或者序列化来实现深拷贝。

优点:

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

缺点

       (1)、每个类必须配备一个克隆方法
       (2)、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

应用场景

         (1)、资源优化场景
                      类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
         (2)、性能和安全要求的场景
                    通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
         (3)、一个对象多个修改者的场景
                    一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
           在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。

以上则为原型模式的全部内容,如有问题请指正,个人Q:1787024563

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值