一.定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
当new一个对象需要非常繁琐的数据准备或访问权限时就可以使用原型模式,原型模式就是java中的clone技术,以某个对象为原型,
复制出新的对象,新的对象具有原型对象的特点。
因此原型模式的核心就是clone技术。
二.角色
1.抽象原型类(Prototype):抽象类或者接口,用来申明clone方法。
2.具体原型类(ConcretePrototype):要被复制的对象。
3.客户端类(客户端类):要使用原型模式的地方。
三.使用说明
以下是个简单的原型模式的使用:
1.首先我们创建个person类实现Cloneable接口,然后重写clone方法:
public class Person implements Cloneable{
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
protected Object clone() {
Person person=null;
try {
person=(Person)super.clone();
person.name=this.name;
person.sex=this.sex;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
}
2.测试:
Person person = new Person();
person.setName("jack");
person.setSex("man");
Person personTwo = (Person) person.clone();
System.out.print(personTwo.toString());
三.原型模式的优缺点:
1.优点:
使用原型模式来创建复杂的对象,可以提升创建对象的效率。
2.缺点:
拷贝对象时不会拷贝构造函数。
四.原型模式在android中的使用:
在android中Intent的源码就使用原型模式:
public class Intent implements Parcelable, Cloneable {
private Intent(Intent o, @CopyMode int copyMode) {
this.mAction = o.mAction;
this.mData = o.mData;
this.mType = o.mType;
this.mPackage = o.mPackage;
this.mComponent = o.mComponent;
if (o.mCategories != null) {
this.mCategories = new ArraySet<>(o.mCategories);
}
if (copyMode != COPY_MODE_FILTER) {
this.mFlags = o.mFlags;
this.mContentUserHint = o.mContentUserHint;
this.mLaunchToken = o.mLaunchToken;
if (o.mSourceBounds != null) {
this.mSourceBounds = new Rect(o.mSourceBounds);
}
if (o.mSelector != null) {
this.mSelector = new Intent(o.mSelector);
}
if (copyMode != COPY_MODE_HISTORY) {
if (o.mExtras != null) {
this.mExtras = new Bundle(o.mExtras);
}
if (o.mClipData != null) {
this.mClipData = new ClipData(o.mClipData);
}
} else {
if (o.mExtras != null && !o.mExtras.maybeIsEmpty()) {
this.mExtras = Bundle.STRIPPED;
}
// Also set "stripped" clip data when we ever log mClipData in the (broadcast)
// history.
}
}
}
@Override
public Object clone() {
return new Intent(this);
}