用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
概念描述感觉不够形象,实际上就是继承一个可以拷贝属性的接口,然后通过这个接口来创建新的对象。
大家看看下面这段代码,这是一个简单的创建对象的代码。
Score score = new Score(); Person person = new Person(score); Person person2 = (Person) person.clone(); //原型拷贝 Person person3 = person; 打印如下: person: id=com.ahacool.designpattern.prototype.Person@40ac8360 mName=张三 mMajor=IT person2: id=com.ahacool.designpattern.prototype.Person@52ed3bff mName=张三 mMajor=IT person3: id=com.ahacool.designpattern.prototype.Person@40ac8360 mName=张三 mMajor=IT
我们发现,person3与person引用同一个对象,person2引用的是新对象。如下图所示:
因此,使用原型拷贝,会创建新的对象;使用”=”赋值只会传递引用地址。
首先需要一个接口类(ProtoType),定义了拷贝的接口。
然后需要一个实现类(ConcreteProtoType),去继承并实现对应的拷贝接口。
最后在需要的地方调用接口即可(Client)。
接口类(ProtoType): public interface Prototype { public Object clone(); } 实现类(ConcreteProtoType): public class Person implements Prototype { public String mName; public String mMajor; public Score mScore; public Person(Score pScore) { mName = "张三"; mMajor = "IT"; mScore = pScore; } public Object clone() { Prototype Prototype = new Person(mScore); return Prototype; } } 调用: Score score = new Score(); Person person = new Person(score); Person person2 = (Person) person.clone(); //原型拷贝
假如原型类中包含了对象,比如实例中的Person,如果希望Score不单单是引用传递的话,而是创建新对象的话,则是深拷贝;如果只是引用传递,则是浅拷贝。对比下面两段代码就能明白了。
浅拷贝: public Person(Score pScore) { mName = "张三"; mMajor = "IT"; mScore = pScore; } 深拷贝: public PersonCloneObject(Score pScore) { mName = "张三"; mMajor = "IT"; mScore = (Score) pScore.clone(); }
代码下载地址:https://github.com/bird7310/DesignPatternExample.git
包名:com.ahacool.designpattern.prototype
挤呀挤呀挤时间,写一篇博客不容易呀。我现在很崇拜那些写了很多博客和出书的人了,要把事情写清楚,并且还得写那么多,真的不容易。
目前想法是以简单为主,能把东西讲清楚就达到目的。今后会在简洁度和清晰度方面下功夫。
原文地址:http://blog.csdn.net/mtt1987/article/details/39316593