转载自:http://blog.csdn.net/lovelion 作者:刘伟
原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的
对象。原型模式是一种对象创建型模式。
原型模式的工作原理很简单:
将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。
由于在软件系统中我们经常会遇到需要创建多个相同或者相似对象的情况,因此原型模式在真实开发中的使用
频率还是非常高的。原型模式是一种“另类”的创建型模式,创建克隆对象的工厂就是原型类自身,
工厂方法由克隆方法来实现。
需要注意的是通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。通过不同的方式修改可以得到一系列相似但不完全相同的对象。
原型模式的结构如图如示:
●Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
● ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
● Program(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
具体代码如下:
ProtoType:
1 abstract class ProtoType 2 { 3 abstract public void setAttr(string str); 4 abstract public String getAttr(); 5 abstract public ProtoType Clone(); 6 }
ConcretePrototype:
1 class ConcretePrototype : ProtoType 2 { 3 private String attr; //成员属性 4 public override void setAttr(String attr) 5 { 6 this.attr = attr; 7 } 8 public override String getAttr() 9 { 10 return this.attr; 11 } 12 //克隆方法 13 public override ProtoType Clone() 14 { 15 //创建个新对象 16 ProtoType cloneObject = new ConcretePrototype(); 17 cloneObject.setAttr(this.attr); 18 return cloneObject; 19 } 20 }
Program:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //创建一个ConcretePrototype对象作为原型对象 6 ProtoType object1 = new ConcretePrototype(); 7 object1.setAttr("Sunny"); 8 //调用Clone方法克隆一个对象 9 ProtoType newObject = object1.Clone(); 10 Console.WriteLine(newObject.getAttr()); 11 12 Console.Read(); 13 } 14 }