原型模式

原型模式

原型模式就是通过clone()方法,进行拷贝原型对象。需要注意的是我们通过clone()方法获得的对象是可以定制的。

举个例子:

假如我们有个Person类

public class Person{
  String name;
  int age;
  
  public Person(String name,int age){
   this.name=name;
   this.age=age;
  };
  ....
}
Person a=new Person("wang",18);
Person b=a;
Person c=a;

表面上看a,b,c应该是三个值相同的Person对象,但需要注意的是a,b,c指向的是同一个对象,也就是说当我们修改其中一个时,其他的也会跟着变化!

Person a=new Person("wang",18);
Person b=a.clone();
Person c=a.clone();

此时a,b,c指向不同的对象,可以实现定制化修改!

clone()方法

实现clone()方法需要继承Cloneable接口。

它的实现也比较简单.我们还以Person为例

@Override
public Person clone(){
   try{
     
       return (Person)super.clone();
   
   }catch (CloneNotSupportedException e){
  
      throw new AssertionError();//不写也行,因为只要继承Cloneable接口就不会产生异常
   }

}

可以注意到我们直接调用super.clone()方法!

但需要注意的是:

super.clone()方法对于引用类型来说,克隆出的对象与原对象指向的是同一个对象!

假如Person类有个属性为 Child类对象。此时我们就不能简单的调用super.clone()方法,而是对引用对象的域进行单独处理

@Override
public Person clone(){
   Person p=null;
   try{
     p=(Person)super.clone();
     p.child=child.clone();
     return p;
   
   }catch (CloneNotSupportedException e){
      throw new AssertionError();//不写也行,因为只要继承Cloneable接口就不会产生异常
   }
}

posted @ 2021-09-20 19:53  刚刚好。  阅读(33)  评论(0编辑  收藏  举报