原型模式用于创建重复的对象,属于创建型模式。
它通过一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的方式来创建出更多相同类型的对象。
包含
- 抽象原型类:原型对象必须实现的接口。
- 具体原型类:实现抽象原型类中的方法,它就是可以被克隆的对象。
- 访问类:使用具体原型类中的clone方法来克隆对象。
/**
* 具体原型类
* 其实现的Cloneable接口就是抽象原型类
* @author : hafuhafu
* @date : 2019/9/18 09:57
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Phone implements Cloneable {
private String name;
private Double price;
private String brand;
private ArrayList<Object> task = new ArrayList<>();
public void show() {
System.out.println("show phone message:" + this.toString());
}
@Override
protected Object clone() {
try {
var object = super.clone();
return object;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
/**
* 访问类
* 该类使用具体原型类的clone方法产生克隆对象
* @author : hafuhafu
* @date : 2019/9/18 10:09
*/
public class PhoneRepository {
public static final String IPHONE = "iPhone";
public static final String MI = "Xiao Mi";
public static final String HW = "Hua Wei";
private static HashMap<String, Phone> phoneHashMap = new HashMap<>();
public static Phone getPhone(String brand) {
Phone phone = phoneHashMap.get(brand);
return ((Phone) phone.clone());
}
public static void initCache() {
Iphone iphone = new Iphone();
iphone.setName("iPhone11 Pro Max");
iphone.setPrice(8599d);
MiPhone miPhone = new MiPhone();
miPhone.setName("Xiao Mi mix4");
miPhone.setPrice(5000d);
HwPhone hwPhone = new HwPhone();
hwPhone.setName("Hua Wei Mate30 Pro");
hwPhone.setPrice(6500d);
phoneHashMap.put(iphone.getBrand(), iphone);
phoneHashMap.put(miPhone.getBrand(), miPhone);
phoneHashMap.put(hwPhone.getBrand(), hwPhone);
}
}
要求
原型模式需要对象实现一个可以克隆(Clone)自身的接口。
原型模式的克隆又分为浅克隆
和深克隆
两种。
浅克隆
通过原有对象创建一个新对象,这个新对象中的属性和原对象中的属性完全相同。但是其中的引用数据类型并没有分配新的内存,而是直接指向被复制属性的内存地址。
在Java中,clone方法来自于父类Object
中,具体原型类只需要实现Cloneable
接口就能完成对象的浅克隆。
深克隆
通过原有对象创建一个新对象,其中所有属性都会被克隆,开辟新的内存空间,而不是指向原有内存地址。
因此我们需要重写clone
方法,将将引用类型