原型模式
原型模式是一种对象创建型模式,它采用复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。
1. 原型模式的特点
- 由原型对象自身创建目标对象。也就是对象创建这一动作发自原型对象本身。
- 目标对象是原型对象的一个克隆。也就是说,通过prototype模式创建的对象,不仅与原对象具有相同的结构,还与原型对象具有相同的值。
- 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
2. 使用方式
Person
package com.liuyao;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
/**
* @author liuyao
* @date 2018/07/30
*/
@Data
@AllArgsConstructor
@ToString
public class Person implements Cloneable{
private int age;
private String name;
private List<String> firendsName;
/**
* 浅克隆,对于引用,直接复制地址,不会新建对象,多个对象公用一个引用对象
* @return
*/
@Override
protected Person clone(){
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
/**
* 深克隆,需处理引用类型的复制
* @return
*/
protected Person cloneDeep(){
try {
Person person= (Person) super.clone();
// 新建List对象
List<String > firends=new ArrayList<>();
for (String f:person.getFirendsName()) {
firends.add(f);
}
person.setFirendsName(firends);
return person;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
为避免set,get等占用太多空间,使用了Lombok,主要是继承Cloneable接口,覆写clone()方法
Main
package com.liuyao;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
List<String> friends=new ArrayList<>();
friends.add("aaa");
friends.add("bbb");
friends.add("ccc");
Person person=new Person(10,"zhangsan",friends);
System.out.println(person);
System.out.println("=== 克隆完 ===");
Person shallowPerson=person.clone();
System.out.println(shallowPerson);
System.out.println("=== 对原型的基本类型修改 ===");
person.setAge(12);
System.out.println(person);
System.out.println(shallowPerson);
System.out.println("=== 对原型的引用类型修改(浅克隆) ===");
friends.add("ddd");
System.out.println(person);
System.out.println(shallowPerson);
System.out.println("=== 对原型的引用类型修改(深克隆) ===");
Person deepPerson=person.cloneDeep();
friends.add("fff");
person.setAge(9);
System.out.println(person);
System.out.println(shallowPerson);
System.out.println(deepPerson);
}
}
3. 应用场景
- 在创建对象的时候,我们不只是希望被创建的对象继承其类的基本结构,还希望继承原对象的数据。
- 希望对目标对象的修改不影响原型对象(采用深克隆)。
- 隐藏克隆操作的细节,很多时候对象的克隆会涉及到类本身的数据。