安卓设计模式-原型模式
android
java
设计模式
clone
定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
定义太恶心,看不懂。。说白了就是对象的克隆。
创建步骤
那我们就回顾下如何克隆对象(深拷贝)。
- 先定义一个实体类Animal
- 实现clonable接口
- 重写clone方法
这三点是必须做的,如果不实现clonable接口,重写clone方法调用是会报异常的。
代码实现
那么首先创建一个Animal类
public class Animal{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后实现Clonable接口
public class Animal implements Cloneable
最后重写clone方法
@Override
protected Object clone(){
Animal animal=null;
try {
animal=(Animal) super.clone();
animal.age=this.age;
animal.name=this.name;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return animal;
}
这里要注意clone方法里的对象是用的(Animal) super.clone();而不是new Animal(),他们是有区别的,前者是调用的本地方法,所以前者是比后者效率高的。
接下来我们在main方法里做测试,看是否真的克隆了
public static void main(String[] args){
Animal animal=new Animal();
animal.setAge(12);
animal.setName("monkey");
System.out.println(animal.getAge());
System.out.println(animal.getName());
Animal animal1=(Animal)animal.clone();
//现在将animal1的age赋值13
animal1.setAge(13);
//如果克隆不成功,修改animal1也会同样修改animal
System.out.println(animal.getAge());
System.out.println(animal.getName());
System.out.println(animal1.getAge());
System.out.println(animal1.getName());
}
输出结果
12
monkey
12
monkey
13
monkey
从结果看克隆成功,这样我们就可以通过克隆对象,来实现原型模式啦。
集合的克隆
集合和对象一样,单纯的list=list1,只是复制的引用,而没有克隆。
集合克隆有两种方法
- 通过序列化再返序列化来实现克隆;
- 遍历被克隆的集合,将每个对象克隆到新集合;
通过序列化、反序列化克隆
public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
List<T> dest = (List<T>) in.readObject();
return dest;
}
通过遍历集合克隆
public List<Animal> deepCopy(List<Animal> lists) {
List<Animal> cloneLists=new ArrayList<Animal>(lists.size());
for (Animal item : lists) {
cloneLists.add((Animal)item.clone());
}
return lists;
}
上边代码注意:new Array()时可以直接初始化固定长度,避免空间浪费。
结束语
其实本篇文章就是讲的对象和集合的深度拷贝,设计模式就是利用深度拷贝后的对象,做简单修改,省去了新new对象对每个属性的赋值。