原型模式是指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。
原型模式的组成
- 抽象原型类:规定了具体原型对象必须实现clone方法
- 具体原型类:实现抽象原型类的clone方法
- 访问类:使用具体原型类的clone方法复制新对象
原型模式的clone分为两种:
- 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原
有属性所指向的对象的内存地址。
- 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
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]); } } }
|
应用场景
- 对象创建逻辑复杂
- 性能和安全要求较高的场景
注意深克隆和浅克隆问题,在需要的场景需要使用深克隆。