
學(xué)會(huì)設(shè)計(jì)模式,你就可以像擁有魔法一樣,在開(kāi)發(fā)過(guò)程中解決一些復(fù)雜的問(wèn)題。設(shè)計(jì)模式是由經(jīng)驗(yàn)豐富的開(kāi)發(fā)者們(GoF)凝聚出來(lái)的最佳實(shí)踐,可以提高代碼的可讀性、可維護(hù)性和可重用性,從而讓我們的開(kāi)發(fā)效率更高。通過(guò)不斷的練習(xí)和實(shí)踐,掌握其中的奧妙,選擇合適的設(shè)計(jì)模式,能為我們的項(xiàng)目增加一絲神奇的魔力。
概念:
用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
實(shí)例:
克隆原本的五菱宏光對(duì)象
目的:
原本的五菱宏光修改配置后,克隆對(duì)象配置不變
適用場(chǎng)景:
需要復(fù)制一些對(duì)象,同時(shí)又希望代碼獨(dú)立于這些對(duì)象所屬的具體類
優(yōu)點(diǎn):
1、使用原型模式創(chuàng)建實(shí)例對(duì)象比直接new一個(gè)對(duì)象性能好,尤其創(chuàng)建大對(duì)象,性能的差別非常明顯。
2、簡(jiǎn)化創(chuàng)建對(duì)象的過(guò)程,可以直接修改現(xiàn)有的對(duì)象實(shí)例的值,達(dá)到復(fù)用的目的
弊端:
1、每個(gè)對(duì)象內(nèi)部都要覆蓋Object的clone方法才能被拷貝,當(dāng)對(duì)類進(jìn)行改造時(shí),需要修改代碼,違背了“開(kāi)閉原則”。
2、如果克隆引用數(shù)據(jù)類型,需要遞歸克隆
類圖:
框架用到的地方:
Java 中,Object 的 clone() 方法
Coding:
Car:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-805243.html
public class Car {
private String name;
private Integer box;
private String power;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBox() {
return box;
}
public void setBox(Integer box) {
this.box = box;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
public Car() {
}
public Car(Car car) {
this.name = car.getName();
this.box = car.getBox();
this.power = car.getPower();
}
public Car clone() {
return new Car(this);
}
public void show() {
System.out.println(
"一輛" + this.getPower() + this.getBox() + "廂" + this.getName()
);
}
}
測(cè)試:
public class Test {
public static void main(String[] args) {
Car wuLing = new Car();
wuLing.setName("五菱宏光");
wuLing.setBox(2);
wuLing.setPower("汽油");
System.out.println("----------原始配置----------");
wuLing.show();
//通過(guò)clone方法創(chuàng)建的新對(duì)象
Car clone = wuLing.clone();
wuLing.setBox(3);
//地址引用
Car wuLing2 = wuLing;
System.out.println("----------修改配置后wuLing----------");
wuLing.show();
System.out.println("----------原始配置后wuLing2----------");
wuLing2.show();
System.out.println("----------原始配置后clone----------");
clone.show();
}
}
我們可以看到wuLing2是直接將wuLing復(fù)制給自己,因?yàn)镴ava的賦值只是傳遞地址,所以wuLing2會(huì)隨著wuLing的配置修改而改變。
但是調(diào)用clone的方法并沒(méi)有因?yàn)閣uLing的配置修改而修改,這是因?yàn)閏lone是一個(gè)被克隆出來(lái)的全新對(duì)象(java自帶的clone方法是淺拷貝)。
如果您想了解更多關(guān)于Java深拷貝和淺拷貝的信息,可以到小名的另一篇文章:Java對(duì)象淺拷貝與深拷貝進(jìn)行詳細(xì)了解??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-805243.html
測(cè)試結(jié)果:
----------原始配置----------
一輛汽油2廂五菱宏光
----------修改配置后wuLing----------
一輛汽油3廂五菱宏光
----------原始配置后wuLing2----------
一輛汽油3廂五菱宏光
----------原始配置后clone----------
一輛汽油2廂五菱宏光
文章后期會(huì)持續(xù)優(yōu)化,如果覺(jué)得小名的文章幫助到了您,請(qǐng)關(guān)注小名,支持一下小名??,給小名的文章點(diǎn)贊??、評(píng)論?、收藏??謝謝大家啦~???
編碼魔法師系列文章,會(huì)收錄在小名的【設(shè)計(jì)模式】專欄中,希望大家可以持續(xù)關(guān)注??
到了這里,關(guān)于【編碼魔法師系列_構(gòu)建型4】原型模式(Prototype Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!