1定义:
利用已有的对象,快速克隆出来另一个与原来对象类似的对象。克隆出来的对象要满足下列三个条件:
(1)对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。
(2)对任何的对象x,都有:x.clone().getClass() == x.getClass(),换言之,克隆对象与原对象的类型一样
(3)如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。
2分类:
原型模式有两种表现形式:(1)简单形式、(2)登记形式
(1)①简单形式的类图:
抽象原型角色:否则克隆方法的抽象
具体原型角色:负责创建克隆对象的具体实现
用户角色:负责提出创建克隆对象的申请
②具体代码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.RootPaneContainer;
public class Client {
public static void main(String[] args) {
ConcreteProtoType1 concreteProtoType1=new ConcreteProtoType1();
ProtoType protoType=concreteProtoType1.clone();
ConcreteProtoType2 concreteProtoType2=new ConcreteProtoType2();
ProtoType protoType2=concreteProtoType2.clone();
System.out.println(protoType2);
}
}
interface ProtoType{
public Object clone();
public void setName(String name);
public String getName();
}
//浅度克隆
class ConcreteProtoType1 implements ProtoType{
private String name;
public ProtoType clone(){
ProtoType protoType=new ConcreteProtoType1();
protoType.setName(this.name);
return protoType;
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public String getName() {
return name;
}
}
class ProtoTypeManager{
private static HashMap<String, ProtoType>map=new HashMap<>();
private ProtoTypeManager(){
}
public static void setProtoType(ProtoType protoType){
}
}
//深度克隆
class ConcreteProtoType2 implements ProtoType,Serializable{
private String name;
public ProtoType clone(){
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//从流里读回来
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (ProtoType)(ois.readObject());
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public String getName() {
return name;
}
}
(2)登记形式
①登记形式的类图
与简单形式相比增加了一个原型管理器角色(负责管理原型对象的)
②代码:
public class Client {
public static void main(String[] args) {
ConcreteProtoType1 concreteProtoType1=new ConcreteProtoType1();
ProtoTypeManager.setProtoType("k1", concreteProtoType1);
ProtoType backConcrete=ProtoTypeManager.getProtoType("k1");
ProtoType protoType=null;
if(backConcrete!=null){
protoType=backConcrete.clone();
}
}
}
interface ProtoType{
public ProtoType clone();
public void setName(String name);
public String getName();
}
//浅度克隆
class ConcreteProtoType1 implements ProtoType{
private String name;
public ProtoType clone(){
ProtoType protoType=new ConcreteProtoType1();
protoType.setName(this.name);
return protoType;
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public String getName() {
return name;
}
}
class ProtoTypeManager{
private static HashMap<String, ProtoType>map=new HashMap<>();
private ProtoTypeManager(){
}
public static void setProtoType(String key,ProtoType protoType){
map.put(key, protoType);
}
public static void removeProtoType(String key){
map.remove(key);
}
public static ProtoType getProtoType(String key){
return map.get(key);
}
}
//深度克隆
class ConcreteProtoType2 implements ProtoType,Serializable{
private String name;
public ProtoType clone(){
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//从流里读回来
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (ProtoType)(ois.readObject());
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
@Override
public void setName(String name) {
this.name=name;
}
@Override
public String getName() {
return name;
}
}
4在android源码中的体现
class Intent implements Cloneable{
public Intent(Intent o) {
this.mAction = o.mAction;
this.mData = o.mData;
this.mType = o.mType;
this.mPackage = o.mPackage;
this.mComponent = o.mComponent;
this.mFlags = o.mFlags;
if (o.mCategories != null) {
this.mCategories = new HashSet<String>(o.mCategories);
}
if (o.mExtras != null) {
this.mExtras = new Bundle(o.mExtras);
}
if (o.mSourceBounds != null) {
this.mSourceBounds = new Rect(o.mSourceBounds);
}
if (o.mSelector != null) {
this.mSelector = new Intent(o.mSelector);
}
if (o.mClipData != null) {
this.mClipData = new ClipData(o.mClipData);
}
}
public Object clone() {
return new Intent(this);
}
}
intent使用的浅度克隆,实现clone接口,实现clone方法