java设计模式face_java设计模式之-------原型模式
一、模式定義
用原型實例指定要創建對象的種類,并通過拷貝這些原型創建新的對象。
二、模式場景假設
此處結合23中設計模式記憶篇作出假設,不關心邏輯是否合理。柳巖在跳舞的時候燒傷了臉,再也回不到原來的型狀。他就克隆一張臉。類圖如下:
三、代碼實現
1、創建一個類柳巖的臉
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{
//創建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創建100萬對象需要 8.220s
//int i=0;
//LiuYanFace liuYanFace = new LiuYanFace();
//while(i<1000000){
//LiuYanFace clone = liuYanFace.clone();
//i++;
//}
}
}
3、原型模式的注意事項
1)潛克隆對應用對象不進行拷貝。
package com.pattern.prototype;
import java.util.Map;
import org.junit.Test;
public class TestProtoType {
@Test
public void testPrototype() throws CloneNotSupportedException{
//創建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創建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偷懶了只克隆本對象,其對象內的數組、引用對象(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{
//創建100萬對象需要 8.524s
//int i=0;
//while(i<1000000){
//LiuYanFace liuYanFace = new LiuYanFace();
//i++;
//}
//創建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修飾。
四、優缺點分析
優點:性能良好、在內存中二進制流的拷貝,比new性能好。
缺點:在拷貝是構造函數不會執行,減少了約束。
總結
以上是生活随笔為你收集整理的java设计模式face_java设计模式之-------原型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上野千鹤子撰文回应结婚传言:为帮朋友办理
- 下一篇: php值比较大小,PHP_PHP浮点比较