目录
- 原型模式
- 1、模式结构
- 2、模式实例
- 2.1 应用场景类图
- 2.2 代码实现
- 3、模式分析
- 3.1 优点
- 3.2 缺点
- 3.3 适用场景
原型模式
原型模式是一种对象创建型模式,建造者模式是一种对象创建型模式,用原型模式可以用原型实例指定创建对象的种类,它允许通过一个原型对象创建多个同类型的其他对象,而无需知道该对象的创建细节,在Java中可以直接使用Object提供的clone()方法来实现对象的克隆(浅克隆)。
1、模式结构
Prototype:抽象原型类,给出所有的具体原型类所需的接口。
ConcretePrototype:具体原型类,被复制的对象,此角色需要实现抽象的原型角色所要求的接口。
Client:客户类。
2、模式实例
当汽车生产商批量生产汽车时,可以对于一个汽车型号进行批量生产,原型模式实现该机制,浅克隆时需要对汽车品牌做调整时,无需修改原车型,修改克隆得到的对象即可,深克隆时批量生产汽车时,汽车品牌也批量生产。
2.1 应用场景类图
原型模式浅克隆的应用类图如下:
原型模式深克隆的应用类图如下:
2.2 代码实现
浅克隆:
(1)Brand.java
public class Brand {
public void install(){
System.out.println("安装汽车品牌");
}
}
(2)Car.java
public class Car implements Cloneable{
private Brand brand;
public Car(){
this.brand = new Brand();
}
@Override
protected Object clone() {
Car clone = null;
try {
clone = (Car)super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("克隆失败...");
}
return clone;
}
public Brand getBrand(){
return this.brand;
}
public void run(){
System.out.println("小汽车能跑了");
}
}
(3)Client.java
public class Client {
public static void main(String[] args) {
Car car,cloneCar;
car = new Car();
cloneCar = (Car)car.clone();
System.out.println("car == cloneCar?");
System.out.println(car == cloneCar);
System.out.println("car.getBrand() == cloneCar.getBrand()?");
System.out.println(car.getBrand() == cloneCar.getBrand());
}
}
深克隆:
(1)Brand.java
public class Brand implements Serializable{
private static final long serialVersionUID = 1L;
public void install(){
System.out.println("安装汽车品牌");
}
}
(2)Car.java
public class Car implements Serializable{
private static final long serialVersionUID = 1L;
private Brand brand = null;
public Car(){
this.brand = new Brand();
}
public Object deepClone() throws IOException, ClassNotFoundException{
//将对象写入流中
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bao);
oos.writeObject(this);
//将对象从流中取出
ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return(ois.readObject());
}
public Brand getBrand(){
return this.brand;
}
public void run(){
System.out.println("小汽车能跑了");
}
}
(3)Client.java
public class Client {
public static void main(String[] args) {
Car car,cloneCar=null;
car = new Car();
try {
cloneCar = (Car) car.deepClone();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("car == cloneCar?");
System.out.println(car == cloneCar);
System.out.println("car.getBrand() == cloneCar.getBrand()?");
System.out.println(car.getBrand() == cloneCar.getBrand());
}
}
3、模式分析
原型模式,在java中使用浅克隆时,当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制;而使用深克隆时,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。
3.1 优点
原型模式简化了创建对象的过程,通过一个已有的实例进行复制提高了创建实例的效率,具有较好的可扩展性。
3.2 缺点
部分时候实现克隆可能较为麻烦。
3.3 适用场景
原型模式适合于当一个类初始化需要消耗很多资源时,有很多相似对象时,可以设计一个原型,通过对成员变量的些微修改来实现;需要时可以用深克隆的方式保存对象的状态,比如实现撤销操作等。
参考文献:设计模式(第2版).清华出版社