安卓设计模式-原型模式
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方法
@Overrideprotected 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赋值13animal1.setAge(13);//如果克隆不成功,修改animal1也会同样修改animalSystem.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对象对每个属性的赋值。

593

被折叠的 条评论
为什么被折叠?



