来说说(Prototype)原型模式

来源:互联网 发布:linux hexdump命令 编辑:程序博客网 时间:2024/05/29 07:56

1.原型模式使用的场合?

当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式可以很好地解决这个问题,因为每个类实例都是相同的,当我们需要多个相同的类实例时,没必要每次都使用new运算符去创建相同的类实例对象,此时我们一般思路就是想——只创建一个类实例对象,如果后面需要更多这样的实例,可以通过对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用。 然而这个思路正是原型模式的实现方式。下面就具体介绍下设计模式中的原型设计模式。
在现实生活中,也有很多原型设计模式的例子,例如,细胞分裂的过程,一个细胞的有丝分裂产生两个相同的细胞;还有西游记中孙悟空变出后孙的本领和火影忍者中鸣人的隐分身忍术等。下面就以孙悟空为例子来演示下原型模式的实现。具体的实现代码如下:
using System;/// <summary>/// 原型模式/// </summary>public class MonkeyKingPrototype{public int m_Id;public int ID{set{ m_Id = value; }get{ return m_Id;}}public MonkeyKingPrototype(int id){m_Id = id;}public abstract MonkeyKingPrototype Clone();}/// <summary>/// 原型模式的继承者/// </summary>public class ConcretePrototype : MonkeyKingPrototype{public ConcretePrototype(int id):base(id){}public override MonkeyKingPrototype Clone(){/// 调用MemberwiseClone方法实现的是浅拷贝,另外还有深拷贝return (ConcretePrototype)this.MemberwiseClone ();}}public class PrototypeMain{public void test(){//孙悟空MonkeyKingPrototype mk1 = new ConcretePrototype (1);//第二个孙悟空MonkeyKingPrototype  mk2 = mk1.Clone () as ConcretePrototype;;// 第三个孙悟空MonkeyKingPrototype  mk3 = mk1.Clone () as ConcretePrototype;;}}


原创粉丝点击