android 原型模式

来源:互联网 发布:网络表妹啥意思 编辑:程序博客网 时间:2024/05/22 09:43

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方法

0 0
原创粉丝点击