原型模式(Prototype Pattern)

原型模式的介绍


原型模式用一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的方法来创建出更多的同类型对象,它与工厂方法模式的实现非常相似,其中原型模式中的Clone方法就类似工厂方法模式中的工厂方法,只是工厂方法模式的工厂方法是通过new运算符重新创建一个新的对象(相当于原型模式的深拷贝实现),而原型模式是通过调用MemberwiseClone方法来对原来对象进行拷贝,也就是复制

原型模式的优点有:

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

原型模式的缺点有:

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

案例
在现实生活中,也有很多原型设计模式的例子,例如,细胞分裂的过程,一个细胞的有丝分裂产生两个相同的细胞;还有西游记中孙悟空变出后孙的本领和火影忍者中鸣人的隐分身忍术等。下面就以孙悟空为例子来演示下原型模式的实现。具体的实现代码如下:


原型模式的UML图


这里写图片描述


原型模式的实现


MokeyKingPrototype:

using System;

namespace DesignModelDemo.PrototypePattern
{
    abstract class MokeyKingPrototype
    {
        public string Id;

        public MokeyKingPrototype(string id)
        {
            this.Id = id;
        }

        public abstract MokeyKingPrototype Clone();
    }
}

ConcretePrototype :

using System;

namespace DesignModelDemo.PrototypePattern
{
    class ConcretePrototype : MokeyKingPrototype
    {
        public ConcretePrototype(string id) : base(id) { }

        public override MokeyKingPrototype Clone()
        {
            // 调用MemberwiseClone方法实现的是浅拷贝,另外还有深拷贝
            return this.MemberwiseClone() as MokeyKingPrototype;
        }
    }
}

Customer:

using System;

namespace DesignModelDemo.PrototypePattern
{
    class Customer
    {
        static void Main(string[] args)
        {
            MokeyKingPrototype concreteMokey = new ConcretePrototype("MokeyKing");

            MokeyKingPrototype cloneMokey1 = concreteMokey.Clone();
            MokeyKingPrototype cloneMokey2 = cloneMokey1.Clone();
            Console.WriteLine("cloneMonkey1,id=" + cloneMokey1.Id);
            Console.WriteLine("cloneMonkey2,id=" + cloneMokey2.Id);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cchoop

有用的话请杯肥宅水

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

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

打赏作者

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

抵扣说明:

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

余额充值