安卓设计模式-原型模式

安卓设计模式-原型模式

android java 设计模式 clone


定义

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 
定义太恶心,看不懂。。说白了就是对象的克隆。

创建步骤

那我们就回顾下如何克隆对象(深拷贝)。

  1. 先定义一个实体类Animal
  2. 实现clonable接口
  3. 重写clone方法

这三点是必须做的,如果不实现clonable接口,重写clone方法调用是会报异常的。

代码实现

那么首先创建一个Animal类

 
  1. public class Animal{
  2. private int age;
  3. private String name;
  4. public int getAge() {
  5. return age;
  6. }
  7. public void setAge(int age) {
  8. this.age = age;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. }

然后实现Clonable接口

 
  1. public class Animal implements Cloneable

最后重写clone方法

 
  1. @Override
  2. protected Object clone(){
  3. Animal animal=null;
  4. try {
  5. animal=(Animal) super.clone();
  6. animal.age=this.age;
  7. animal.name=this.name;
  8. } catch (CloneNotSupportedException e) {
  9. e.printStackTrace();
  10. }
  11. return animal;
  12. }

这里要注意clone方法里的对象是用的(Animal) super.clone();而不是new Animal(),他们是有区别的,前者是调用的本地方法,所以前者是比后者效率高的。


接下来我们在main方法里做测试,看是否真的克隆了

 
  1. public static void main(String[] args){
  2. Animal animal=new Animal();
  3. animal.setAge(12);
  4. animal.setName("monkey");
  5. System.out.println(animal.getAge());
  6. System.out.println(animal.getName());
  7. Animal animal1=(Animal)animal.clone();
  8. //现在将animal1的age赋值13
  9. animal1.setAge(13);
  10. //如果克隆不成功,修改animal1也会同样修改animal
  11. System.out.println(animal.getAge());
  12. System.out.println(animal.getName());
  13. System.out.println(animal1.getAge());
  14. System.out.println(animal1.getName());
  15. }

输出结果 
12 
monkey 
12 
monkey 
13 
monkey

从结果看克隆成功,这样我们就可以通过克隆对象,来实现原型模式啦。

集合的克隆

集合和对象一样,单纯的list=list1,只是复制的引用,而没有克隆。 
集合克隆有两种方法

  1. 通过序列化再返序列化来实现克隆;
  2. 遍历被克隆的集合,将每个对象克隆到新集合;

通过序列化、反序列化克隆

 
  1. public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
  2. ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
  3. ObjectOutputStream out = new ObjectOutputStream(byteOut);
  4. out.writeObject(src);
  5. ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
  6. ObjectInputStream in = new ObjectInputStream(byteIn);
  7. @SuppressWarnings("unchecked")
  8. List<T> dest = (List<T>) in.readObject();
  9. return dest;
  10. }

通过遍历集合克隆

 
  1. public List<Animal> deepCopy(List<Animal> lists) {
  2. List<Animal> cloneLists=new ArrayList<Animal>(lists.size());
  3. for (Animal item : lists) {
  4. cloneLists.add((Animal)item.clone());
  5. }
  6. return lists;
  7. }

上边代码注意:new Array()时可以直接初始化固定长度,避免空间浪费。

结束语

其实本篇文章就是讲的对象和集合的深度拷贝,设计模式就是利用深度拷贝后的对象,做简单修改,省去了新new对象对每个属性的赋值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值