原型模式 - OK
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
简单说来原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
原型模式UML图:

原型模式的基本代码结构:

namespace ConsoleApplication1
{
abstract class Prototype
{
private string id; public Prototype(string id)
{
this.id = id;
} public string Id
{
get { return id; }
} public abstract Prototype Clone(); //抽象类的关键就是要有这样一个克隆方法
} //具体原型类
class ConcretePrototype1 : Prototype
{
public ConcretePrototype1(string id): base(id)
{ } public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone(); //创建当前对象的浅表副本。方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
//如果字段是值类型,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象
//因此,原始对象及其副本引用同意对象
}
} class Program
{
static void Main(string[] args)
{
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); //原型模式创建对象
Console.WriteLine("Cloned:{0}",c1.Id); //输出 Cloned:I Console.ReadKey();
}
}
}

原型模式的作用:我们知道每new一次对象,都需要执行一次构造函数,如果构造函数的执行时间很长,那么多次的执行初始化操作就比较低效。一半在初始化的信息不发生变化的情况下,克隆是最好的办法,这既隐藏了对象创建的细节,又能对性能是大大的提高。不用重新初始化对象,而是动态地获得对象运行时的状态。
在使用原型模式中,有必要注意浅复制与深复制的概念。
对于上面的原型结构示例代码:我们知道如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同意对象。
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。也就是说,浅复制复制出来的对象,如果里面含有引用类型的数据,则浅复制复制出来的对象与原对象是同一个,因为仅复制引用地址嘛。
深复制:当执行复制时,被复制的对象含有引用类型对象的变量时,引用类型的变量对象也重新复制一份,即复制出来的引用对象与原类中的对象不是指向同一个地址。
因此,在使用原型模式时必须要分析好,是该浅复制还是深复制。
回到《大话设计模式中的示例》 简历的原型实现:

namespace ConsoleApplication1
{
class WorkExperience : ICloneable //主要,要让工作经历实现ICloneable
{
private string workDate;
public string WorkDate
{
get { return workDate; }
set { workDate = value; }
} private string company;
public string Company
{
get { return company; }
set { company = value; }
} public Object Clone()
{
return (Object)this.MemberwiseClone();
}
} //简历类
class Resume : ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience work; public Resume(string Name)
{
this.name = Name;
work = new WorkExperience();
} private Resume(WorkExperience Work)
{
this.work = (WorkExperience)Work.Clone(); //注意深复制必须要添加此段代码,提供Clone方法调用的私有构造函数以便克制工作经历
} //设置个人信息
public void SetPersonnalInfo(string Sex, string Age)
{
this.sex = Sex;
this.age = Age;
} //设置工作经历
public void SetWorkExperience(string workDate, string company)
{
work.WorkDate = workDate;
work.Company = company;
} //显示
public void Display()
{
Console.WriteLine("{0} {1} {2}",name,sex,age);
Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company);
} public Object Clone()
{
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age;
return obj;
}
} class Program
{
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a.SetPersonnalInfo("男","");
a.SetWorkExperience("1998-2000","微软"); Resume b = (Resume)a.Clone();
b.SetWorkExperience("2000-2004","google"); Resume c = (Resume)a.Clone();
c.SetPersonnalInfo("男","");
c.SetWorkExperience("1998-2004","苹果"); a.Display();
b.Display();
c.Display(); Console.ReadKey();
}
}
}

原型模式 - OK的更多相关文章
- 设计模式(六)原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- PHP 原型模式
原型模式:原型模式是先创建好一个原型对象,然后通过拷贝原型对象来创建新的对象.适用于大对象的创建,因为创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可.也可以用作动态 ...
- C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝
原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一 ...
- 设计模式--原型模式Prototype(创建型)
一.原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.原型模式实现的关键就是实现Clone函数,还需要实现深拷贝. 二.UML类图 三.例子 //父类 class Resume ...
- C#设计模式之原型模式
原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象. 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对 ...
- 设计模式 之 原型模式(ProtoType)
什么时原型模式 或 原型模式的定义: 用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式的特点: 1),它是面向接口编程, 2),原型模式的新对象是对原型实例的一个克隆 ...
- Objective-C 原型模式 -- 简单介绍和使用
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建 ...
- C#设计模式-原型模式
在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配 ...
- C#设计模式系列:原型模式(Prototype)
1.原型模式简介 1.1>.定义 原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 1.2>.使用频率 中 1.3>.原型模式应用 首先 ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
随机推荐
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子
转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...
- 复合命令A等效于$a
时间:2014.06.28 地点:基地 ------------------------------------------------------------------------------- ...
- 从不同层面看cocos2d-x
一 框架层面 二 Lua层面 三 工具层面 四 android打包 一 框架层 总体来说,cocos2dX提供的一个简便的框架,包括了渲染,动画,事件分发,网络还有UI,物理引擎等几大 ...
- [React] React Router: Route Parameters
A router library is no good if we have to hardcode every single route in our application. In this le ...
- Struts的核心配置
一.配置struts.xml文件 1.struts.xml文件 2.常量配置 <constant> struts.properities web.xml中的<init-param&g ...
- ref和out与SQL中的output
什么时候会需要使用ref和out 有时,我们会需要获取某个值在方法中的运行状态,根据定义的方法,我们仅仅能够获得一个返回值,但是,有时我们也许想获取多个值,通过返回值就不能返回这样的信息,我们可以通过 ...
- .NET MVC通过反射获取数据修改历史记录,并插入数据表中
本文属于原创,转载时请标明出处! 折磨了我一个晚上的问题,奈何对物理的反射印象太深了,整天去想着物理的反射.折射怎么解.感谢少将哥哥给我的指点,经过一个晚上对反射的恶补,最终搞定了.纪念一下. 1.核 ...
- 动态绑定、阻止继承,final类和方法
1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...
- Linux下makefile(一)
makefile关系到了整个工程的编译规则.一个工程中的源文件不计数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文 ...