1.什么是原型模式
就是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。简单来说就是拷贝一些类的对象
2.场景
比如我现在开一条流水线,制作华为mate50的手机,制作一台mate50需要几百个属性,人工做一台还好一些,如果要几百万台的话一模一样的mate50的话,这个时候就需要机器开一条流水线制作了。
例如人工制作mate50的代码
@Data
@AllArgsConstructor
public class Mate50 {
/**
* 手机壳
*/
private String shell;
/**
* 电池
*/
private String cell;
/**
* 芯片
*/
private String slug;
}
@Test
public void makePhone() throws CloneNotSupportedException {
Mate50 m = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m1 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m2 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m3 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m4 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m5 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m6 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m7 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m8 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m9 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
Mate50 m10 = new Mate50("昆仑玻璃","5000MA电池","麒麟9030");
}
这样人工的话会new多个对象,并不方便,使用了原型模式后的代码 同样可以得到结果
@Data
@AllArgsConstructor
public class Mate50 implements Cloneable{
/**
* 手机壳
*/
private String shell;
/**
* 电池
*/
private String cell;
/**
* 芯片
*/
private String slug;
@Override
public String toString() {
System.out.println("地址:" + super.toString());
return "Mate50{" +
"手机壳='" + shell + '\'' +
", 电池='" + cell + '\'' +
", 芯片='" + slug + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("开始克隆");
return super.clone();
}
}
这样就解决了重复数据new对象的问题,不过clone方法是浅拷贝,如果要进行深拷贝的话,要实现额外的代码,这样就会使得对象里面的方法变的复杂,这个也是原型模式的一个缺点