0%

原型模式

原型模式是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

原型模式的组成

  1. 抽象原型类:规定了具体原型对象必须实现clone方法
  2. 具体原型类:实现抽象原型类的clone方法
  3. 访问类:使用具体原型类的clone方法复制新对象

原型模式的clone分为两种:

  1. 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原
    有属性所指向的对象的内存地址。
  2. 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

java Object类的clone方法为浅克隆

原型模式实现


public class demo1 {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype r1 = new Realizetype();
Realizetype r2 = r1.clone();
System.out.println(r1==r2);
}
}

class Realizetype implements Cloneable{
public Realizetype(){
System.out.println("创建原型对象");
}

@Override
protected Realizetype clone() throws CloneNotSupportedException {
System.out.println("原型对象复制成功");
return (Realizetype)super.clone();
}
}

用原型模式批量创建奖状:

public class Prize implements Cloneable{
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println(name+"同学,获得三好学生奖励");
}

@Override
protected Prize clone() throws CloneNotSupportedException {
return (Prize)super.clone();
}

public static void main(String[] args) throws CloneNotSupportedException {
Prize p = new Prize();
String[] peoples = {"张三","李四","王五"};
Prize[] prizes = new Prize[peoples.length];
for (int i=0;i<peoples.length;i++){
prizes[i] = p.clone();
prizes[i].setName(peoples[i]);
}
}
}

应用场景

  1. 对象创建逻辑复杂
  2. 性能和安全要求较高的场景

注意深克隆和浅克隆问题,在需要的场景需要使用深克隆。