java设计模式face_java设计模式之-------原型模式
一、模式定義
用原型實例指定要創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。
二、模式場景假設(shè)
此處結(jié)合23中設(shè)計模式記憶篇作出假設(shè),不關(guān)心邏輯是否合理。柳巖在跳舞的時候燒傷了臉,再也回不到原來的型狀。他就克隆一張臉。類圖如下:
三、代碼實現(xiàn)
1、創(chuàng)建一個類柳巖的臉
package com.pattern.prototype;
/**
* 建立一個類,代表柳巖的臉
* @author dgw
*
*/
public class LiuYanFace implements Cloneable{
//臉的顏色
private String color;
public LiuYanFace(){
//System.out.println("柳巖的臉");
}
public LiuYanFace(String color) {
super();
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//重新Object中的clone方法
@Override
protected LiuYanFace clone() throws CloneNotSupportedException {
return (LiuYanFace) super.clone();
}
}
2,測試代碼
package com.pattern.prototype;
import org.junit.Test;
public class TestProtoType {
@Test
public void testPrototype() throws CloneNotSupportedException{
//創(chuàng)建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創(chuàng)建100萬對象需要 8.220s
//int i=0;
//LiuYanFace liuYanFace = new LiuYanFace();
//while(i<1000000){
//LiuYanFace clone = liuYanFace.clone();
//i++;
//}
}
}
3、原型模式的注意事項
1)潛克隆對應(yīng)用對象不進行拷貝。
package com.pattern.prototype;
import java.util.Map;
import org.junit.Test;
public class TestProtoType {
@Test
public void testPrototype() throws CloneNotSupportedException{
//創(chuàng)建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創(chuàng)建100萬對象需要 8.220s
//int i=0;
//LiuYanFace liuYanFace = new LiuYanFace();
//while(i<1000000){
//LiuYanFace clone = liuYanFace.clone();
//i++;
//}
//原型對象
LiuYanFace liuYanFace = new LiuYanFace("白的");
//克隆對象
LiuYanFace clone = liuYanFace.clone();
clone.setColor("黑的");
//原型對象的顏色
System.out.println(liuYanFace.getColor());//白的
//克隆對象的顏色
System.out.println(clone.getColor());//黑的
//克隆對象的顏色
System.out.println(liuYanFace.map);
//{prototype=白的}
System.out.println(clone.map);
//{prototype=白的}
//修改克隆對象的map中顏色
clone.map.put("prototype", "黃的");
//見鬼了嗎,怎么都改為黃色了,哈哈,這就是潛克隆。java偷懶了只克隆本對象,其對象內(nèi)的數(shù)組、引用對象(String除外)都不拷貝。
System.out.println(liuYanFace.map);//黃的
System.out.println(clone.map);//黃的
}
}
2)深克隆,深拷貝。
package com.pattern.prototype;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 建立一個類,代表柳巖的臉
* @author dgw
*
*/
public class LiuYanFace implements Cloneable{
public Map map=new HashMap();
//臉的顏色
private String color;
public LiuYanFace(){
//System.out.println("柳巖的臉");
}
public LiuYanFace(String color) {
super();
this.color = color;
map.put("prototype", color);
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//重新Object中的clone方法
@SuppressWarnings("unchecked")
@Override
protected LiuYanFace clone(){
LiuYanFace face=null;
try {
face=(LiuYanFace) super.clone();
//深度克隆
//face.map=(Map) ((HashMap) this.map).clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return face;
}
}
package com.pattern.prototype;
import java.util.Map;
import org.junit.Test;
public class TestProtoType {
@Test
public void testPrototype() throws CloneNotSupportedException{
//創(chuàng)建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創(chuàng)建100萬對象需要 8.220s
//int i=0;
//LiuYanFace liuYanFace = new LiuYanFace();
//while(i<1000000){
//LiuYanFace clone = liuYanFace.clone();
//i++;
//}
//原型對象
LiuYanFace liuYanFace = new LiuYanFace("白的");
//克隆對象
LiuYanFace clone = liuYanFace.clone();
clone.setColor("黑的");
//原型對象的顏色
System.out.println(liuYanFace.getColor());//白的
//克隆對象的顏色
System.out.println(clone.getColor());//黑的
//克隆對象的顏色
System.out.println(liuYanFace.map);
//{prototype=白的}
System.out.println(clone.map);
//{prototype=白的}
//修改克隆對象的map中顏色
clone.map.put("prototype", "黃的");
System.out.println(liuYanFace.map);//白的
System.out.println(clone.map);//黃的
}
}
3)需要考培的屬性不能使用final修飾。
四、優(yōu)缺點分析
優(yōu)點:性能良好、在內(nèi)存中二進制流的拷貝,比new性能好。
缺點:在拷貝是構(gòu)造函數(shù)不會執(zhí)行,減少了約束。
總結(jié)
以上是生活随笔為你收集整理的java设计模式face_java设计模式之-------原型模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上野千鹤子撰文回应结婚传言:为帮朋友办理
- 下一篇: 面试问外观模式???这不就是设计模式里面