1.什么是原型模式
就是用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象识埋。簡單來說就是拷貝一些類的對象
2.場景
比如我現(xiàn)在開一條流水線,制作華為mate50的手機(jī),制作一臺mate50需要幾百個屬性空繁,人工做一臺還好一些,如果要幾百萬臺的話一模一樣的mate50的話朱庆,這個時候就需要機(jī)器開一條流水線制作了盛泡。
例如人工制作mate50的代碼
@Data
@AllArgsConstructor
public class Mate50 {
/**
* 手機(jī)殼
*/
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");
}
image.png
這樣人工的話會new多個對象,并不方便娱颊,使用了原型模式后的代碼 同樣可以得到結(jié)果
@Data
@AllArgsConstructor
public class Mate50 implements Cloneable{
/**
* 手機(jī)殼
*/
private String shell;
/**
* 電池
*/
private String cell;
/**
* 芯片
*/
private String slug;
@Override
public String toString() {
System.out.println("地址:" + super.toString());
return "Mate50{" +
"手機(jī)殼='" + shell + '\'' +
", 電池='" + cell + '\'' +
", 芯片='" + slug + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("開始克隆");
return super.clone();
}
}
image.png
這樣就解決了重復(fù)數(shù)據(jù)new對象的問題傲诵,不過clone方法是淺拷貝,如果要進(jìn)行深拷貝的話箱硕,要實現(xiàn)額外的代碼拴竹,這樣就會使得對象里面的方法變的復(fù)雜,這個也是原型模式的一個缺點