一、概念
为了提高效率,我们经常用复制的方式,所以,做从头一点点(初始化一个新的对象),结果就像直接使用(行时的状态)。
前几天我做演讲的ppt,就有偷懒之嫌~ 把大家的优秀博客。截图然后copy到ppt其中,这样免去了又一次构思这一环节,高质量(大家的功劳 O(∩_∩)O~)。高效率。
设计模式中也不乏类似功能的模式。
原型模式便是当中之中的一个。
原型模式(Prototype):用原型实例指定创建对象的种类。而且通过拷贝这些原型创建新的对象。不须要知道不论什么创建的细节。
二、UML图
客户(Client)对象:使用原型对象的客户程序
抽象原型(Prototype)对象:声明了克隆自身。且详细原型对象必须实现的接口(假设是深复制,必须有实现clone的规定)。
详细类型(ConcretePrototype)对象:从抽象原型派生而来。是客户程序使用的对象,即被复制的对象。此角色须要实现抽象原型角色所要求的接口,实现一个克隆自身的操作。
三、实例解析
学习了设计模式之后,小M最终有了一份工作(满18了,木有非法使用童工。。)。为了获得很多其它推销自己的机会。她设计了一张自己的名片,包括的信息有:姓名 性别 年龄 电话。
可是一张名片送人之后。就再也没有了,所以她通过原型模式又给自己copy了几张。
//client代码
class Program
{
static void Main(string[] args)
{
ConcreteBussinessCard bc = new ConcreteBussinessCard("小M");
bc.SetPersonalInfo("女","18","12345678901");
//克隆类ConcreteBussinessCard的对象bc就能得到新的实例bc1
ConcreteBussinessCard bc1 = (ConcreteBussinessCard)bc.Clone();
bc1.SetPersonalInfo("女", "18", "12345678901");
bc.Display();
bc1.Display();
Console.Read();
}
}
//抽象名片类
abstract class BussinessCard
{
//定义名片包括信息:姓名,性别,年龄。电话号码为私有变量
private string name;
private string sex;
private string age;
private string phoneNumber;
//构造函数
public BussinessCard(string name)
{
this.name = name;
}
//设置个人信息
public void SetPersonalInfo(string sex, string age,string phoneNumber)
{
this.sex = sex;
this.age = age;
this.phoneNumber = phoneNumber;
}
//显示
public void Display()
{
Console.WriteLine("姓名:{0} 性别:{1} 年龄:{2}",name ,sex ,age );
Console.WriteLine(" 电话:{0}",phoneNumber );
}
//关键是这里有一个Clone方法
public abstract BussinessCard Clone();
}
//详细名片类
class ConcreteBussinessCard : BussinessCard
{
public ConcreteBussinessCard(string name)
: base(name)
{ }
public override BussinessCard Clone()
{
return (BussinessCard)this.MemberwiseClone();//创建当前的浅表副本。
} } }
四、深复制和浅复制
背景:MemberwiseClone()方法是这样,假设字段是值类型的,则对该字段运行逐位复制,假设字段是引用类型,则复制引用但不复制引用的对象;因此。原始对象及其复本引用同一对象。
浅复制:被复制对象的全部变量都含有与原来的对象同样的值,而全部的对其它对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
五、总结
原型模式可以简化代码。优化设计。让我们摆脱了手工抄写的时代。代码相同可以推动社会进步!
Ps:对深复制和浅复制的理解还非常浅,看了一些大牛博客。这不是很清楚,我们期待着教练!
版权声明:本文博主原创文章,博客,未经同意不得转载。