【GOF23設計模式】原型模式

【GOF23設計模式】原型模式

來源:http://www.bjsxt.com/?
一、【GOF23設計模式】_原型模式、prototype、淺復制、深復制、Cloneable接口?
原型模式

淺復制

 1 package com.test.prototype;
 2 
 3 import java.util.Date;
 4 
 5 /**
 6  * 淺復制
 7  */
 8 public class Sheep implements Cloneable{//Cloneable為標記接口
 9     private String sname;
10     private Date birthday;
11 
12     @Override
13     protected Object clone() throws CloneNotSupportedException {
14         Object obj = super.clone();//直接調用object對象的clone()方法
15         return obj;
16     }
17 
18     public Sheep() {
19     }
20 
21     public Sheep(String sname, Date birthday) {
22         super();
23         this.sname = sname;
24         this.birthday = birthday;
25     }
26 
27     public String getSname() {
28         return sname;
29     }
30 
31     public void setSname(String sname) {
32         this.sname = sname;
33     }
34 
35     public Date getBirthday() {
36         return birthday;
37     }
38 
39     public void setBirthday(Date birthday) {
40         this.birthday = birthday;
41     }
42 }
 1 package com.test.prototype;
 2 
 3 import java.util.Date;
 4 /**
 5  * 測試原型模式(淺復制)
 6  */
 7 public class Client {
 8     public static void main(String[] args) throws Exception {
 9         Date date = new Date(3333332323L);
10         Sheep s1 = new Sheep("少利", date);
11         Sheep s2 = (Sheep) s1.clone();
12 
13         System.out.println(s1);
14         System.out.println(s1.getSname());
15         System.out.println(s1.getBirthday());
16         date.setTime(332324355555555L);//淺復制:s1和s2指向同一date對象的地址,一改全改
17         System.out.println(s1.getBirthday());//s1.getBirthday() == s2.getBirthday()
18 
19         s2.setSname("多利");
20         System.out.println(s2);
21         System.out.println(s2.getSname());
22         System.out.println(s2.getBirthday());
23     }
24 }

控制臺輸出:s1修改時間后,s2的也跟著改(Fri Dec 10 00:59:15 CST 12500)

com.test.prototype.Sheep@1db9742
少利
Sun Feb 08 21:55:32 CST 1970
Fri Dec 10 00:59:15 CST 12500
com.test.prototype.Sheep@647e05
多利
Fri Dec 10 00:59:15 CST 12500

深復制

 1 package com.test.prototype;
 2 
 3 import java.util.Date;
 4 
 5 /**
 6  * 深復制
 7  */
 8 public class Sheep2 implements Cloneable{//Cloneable為標記接口
 9     private String sname;
10     private Date birthday;
11 
12     @Override
13     protected Object clone() throws CloneNotSupportedException {
14         Object obj = super.clone();//直接調用object對象的clone()方法
15 
16         //添加如下代碼實現深復制(Deep Clone)
17         Sheep2 s = (Sheep2) obj;
18         s.birthday = (Date) this.birthday.clone();//屬性克隆!
19 
20         return obj;
21     }
22 
23     public Sheep2() {
24     }
25 
26     public Sheep2(String sname, Date birthday) {
27         super();
28         this.sname = sname;
29         this.birthday = birthday;
30     }
31 
32     public String getSname() {
33         return sname;
34     }
35 
36     public void setSname(String sname) {
37         this.sname = sname;
38     }
39 
40     public Date getBirthday() {
41         return birthday;
42     }
43 
44     public void setBirthday(Date birthday) {
45         this.birthday = birthday;
46     }
47 }
 1 package com.test.prototype;
 2 
 3 import java.util.Date;
 4 /**
 5  * 測試原型模式(深復制)
 6  */
 7 public class Client2 {
 8     public static void main(String[] args) throws Exception {
 9         Date date = new Date(3333332323L);
10         Sheep2 s1 = new Sheep2("少利", date);
11         Sheep2 s2 = (Sheep2) s1.clone();
12 
13         System.out.println(s1);
14         System.out.println(s1.getSname());
15         System.out.println(s1.getBirthday());
16         date.setTime(332324355555555L);//淺復制:s1和s2指向同一date對象的地址,一改全改
17         System.out.println(s1.getBirthday());//s1.getBirthday() == s2.getBirthday()
18 
19         s2.setSname("多利");
20         System.out.println(s2);
21         System.out.println(s2.getSname());
22         System.out.println(s2.getBirthday());
23     }
24 }

控制臺輸出:s1修改時間后,s2還是最初的(Sun Feb 08 21:55:32 CST 1970)

com.test.prototype.Sheep2@1db9742
少利
Sun Feb 08 21:55:32 CST 1970
Fri Dec 10 00:59:15 CST 12500
com.test.prototype.Sheep2@647e05
多利
Sun Feb 08 21:55:32 CST 1970

二、【GOF23設計模式】_原型模式、反序列化實現深復制、效率對比、創建型模式總結?
利用序列化和反序列化技術實現深復制

 1 package com.test.prototype;
 2 
 3 import java.io.ByteArrayInputStream;
 4 import java.io.ByteArrayOutputStream;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.util.Date;
 8 /**
 9  * 原型模式(使用序列化和反序列化的方式實現深復制)
10  */
11 public class Client3 {
12     public static void main(String[] args) throws Exception {
13         Date date = new Date(3333332323L);
14         Sheep s1 = new Sheep("少利", date);
15 
16         System.out.println(s1);
17         System.out.println(s1.getSname());
18         System.out.println(s1.getBirthday());
19 
20 //      Sheep s2 = (Sheep) s1.clone();
21         //使用序列化和反序列化實現深復制
22         //序列化
23         ByteArrayOutputStream bos = new ByteArrayOutputStream();
24         ObjectOutputStream    oos = new ObjectOutputStream(bos);
25         oos.writeObject(s1);
26         byte[] bytes = bos.toByteArray();
27 
28         //反序列化
29         ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
30         ObjectInputStream    ois = new ObjectInputStream(bis);
31 
32         Sheep s2 = (Sheep) ois.readObject();//深復制的對象
33 
34         System.out.println("修改原型對象的屬性值");
35         date.setTime(332324355555555L);
36         System.out.println(s1.getBirthday());
37 
38         s2.setSname("多利");
39         System.out.println(s2);
40         System.out.println(s2.getSname());
41         System.out.println(s2.getBirthday());
42     }
43 }

短時間大量創建對象時,原型模式和普通new方式效率測試:

 1 package com.test.prototype;
 2 /**
 3  * 測試普通new方式創建對象和clone方式創建對象的效率差異!
 4  * 如果需要短時間創建大量對象,并且new的過程比較耗時,則可以考慮使用原型模式!
 5  */
 6 public class Client4 {
 7 
 8     public static void testNew(int size){
 9         long start = System.currentTimeMillis();
10         for (int i = 0; i < size; i++) {
11             Laptop t = new Laptop();
12         }
13         long end = System.currentTimeMillis();
14         System.out.println("new的方式創建耗時:" + (end - start));
15     }
16 
17     public static void testClone(int size) throws CloneNotSupportedException{
18         long start = System.currentTimeMillis();
19         Laptop t = new Laptop();
20         for (int i = 0; i < size; i++) {
21             Laptop temp = (Laptop) t.clone();
22         }
23         long end = System.currentTimeMillis();
24         System.out.println("clone的方式創建耗時:" + (end - start));
25     }
26 
27     public static void main(String[] args) throws Exception {
28         testNew(1000);
29         testClone(1000);
30     }
31 }
32 
33 class Laptop implements Cloneable{//筆記本電腦
34     public Laptop(){
35         try{
36             Thread.sleep(10);//模擬創建對象耗時的過程!
37         }catch(InterruptedException e){
38             e.printStackTrace();
39         }
40     }
41 
42     @Override
43     protected Object clone() throws CloneNotSupportedException {
44         Object obj = super.clone();//直接調用object對象的clone()方法
45         return obj;
46     }
47 }

控制臺輸出:

new的方式創建耗時:10168
clone的方式創建耗時:10

開發中的應用場景:?
原型模式很少單獨出現,一般和工廠模式一起出現,通過clone的方法創建一個對象,然后由工廠方法提供給調用者。?
spring中bean的創建實際就是兩種:單例模式和原型模式(原型模式需要和工廠模式搭配起來)。

創建型模式的總結:?
創建型模式的總結

posted on 2016-08-24 12:30 ErBing 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/erbing/p/5802444.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256518.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ANSYS——自定義的梁截面中心(法線節點)的偏置,詳細全面

目錄 1、ANSYS梁的確定 2.關于梁截面的一些名詞 總體坐標系 梁截面坐標系 梁單元的坐標系

Deepfacelab 小白教程

不小心入了AI換臉的坑&#xff0c;但是感覺AI換臉很有意思&#xff0c;第一次感覺科研使我快樂。 目錄 一、AI換臉軟件簡介 二、Deepfacelab下載安裝 三、Deepfacelab Demo實現 四、Deepfacelab 填坑 五、總結 一、AI換臉軟件簡介 這個沒有具體使用過&#xff0c;目前我…

Underscore.js 的模板功能

Underscore是一個非常實用的JavaScript庫&#xff0c;提供許多編程時需要的功能的支持&#xff0c;他在不擴展任何JavaScript的原生對象的情況下提供很多實用的功能。 無論你寫一段小的js代碼&#xff0c;還是寫一個大型的HTML5應用&#xff0c;underscore都能幫上忙。目前&…

ANSYS——查看剖面圖的應力分布云圖以及工作平面的相關設置

剖面圖和切片圖其實差不多,只是切片圖只有一個截面,而剖面圖是切去一部分保留另一部分模型,不但可以看到截面處應力分布還可以看到剩余模型的應力分布 切片應力云圖可見:https://blog.csdn.net/qq_45769063/article/details/106357700 1.剖面云圖的查看 首先將工作平面的…

2016.8.2

高端內存映射方式 高端內存映射分為三種&#xff1a;永久映射、臨時映射和非連續動態內存映射。高端內存一般是指896MB以上的頁框&#xff0c;這段區間內核一般不能直接訪問。 1.永久映射 永久內核映射允許內核建立高端頁框到內核地址空間的長期映射。它們使用主內核頁表中的一…

深度學習之pytorch(三) C++調用

玩深度學習&#xff0c;個人覺得基于anaconda的python適合開發與測試&#xff0c;C適合實際的工程部署&#xff01;而pytorch官方有編譯好的libtorch&#xff0c;特別方便&#xff0c;適合于我這樣的伸手黨和手殘黨(win10下編譯tensorflow編譯了好久都沒通過&#xff0c;好憂傷…

ANSYS入門——模態分析步驟與實例詳解

目錄 一、ANSYS求解模態分析步驟 建模 施加載荷和求解

javascript庫之Mustache庫使用說明

一、簡單示例 代碼&#xff1a; 1 function show(t) { 2 $("#content").html(t); 3 } 4 5 var view { 6 title: YZF, 7 cacl: function () { 8 return …

Light OJ 1007

求區間歐拉函數平方和。。。 最后因為longlong 范圍爆了WA 了&#xff0c; 0.0 #include<bits/stdc.h> using namespace std; const int maxn 5000000 131; typedef unsigned long long LL;bool Com[maxn]; LL Num[maxn], Prim[maxn / 3]; int Cnt;void INIT() {Num[1]…

MVC架構設計——EF-Code First

詳情參考:http://www.cnblogs.com/guomingfeng/archive/2013/05/28/mvc-ef-repository.html轉載于:https://www.cnblogs.com/shuai7boy/p/5807678.html

機器學習(一) 基于sklearn庫的數據集劃分(交叉驗證)

機器學習中首要環節就是數據集的處理&#xff0c;其中數據集的處理從個人理解(如有錯誤敬請諒解)的角度來說包括兩個方面&#xff1a;數據集劃分和數據清理。其中數據集劃分是指訓練集、驗證集和測試集的數據類別劃分&#xff1b;數據清理是指數據的清洗、刪除等等方面。這兩天…

ANSYS——模態分析的理論基礎

目錄 一、模態分析理論基礎 線性與非線性 振動與固有頻率 振動方程與振動模態

購物中心潮--我的創業之路

2014年10一個月&#xff0c;我在中國大陸從北我的兩個小伙伴跑到最南邊中國內地。大半個中國刪除更多。早在北京成立購潮商城。2014年11月&#xff0c;購潮商城正式上線。上線當天突破零訂單。2014年12月&#xff0c;正式推廣市場。滲透大學生校園。2015年2月至今&#xff0c;正…

敏捷項目開源管理軟件ScrumBasic(2)- 多項目支持

1.加入Project對象模型 public class Project{[Key][MaxLength(32)]public string ID { get; set; }public string Name { get; set; }public int Order { get; set; }public ICollection<UserStory> Stories { get; set; }public ApplicationUser Creator { get; set; }…

postgresql表和列注釋(描述)

2019獨角獸企業重金招聘Python工程師標準>>> PostgreSQL添加表和列注釋。本文為測試表test&#xff0c;默認無注釋。 test# \d關聯列表架構模式 | 名稱 | 類型 | 擁有者 | 大小 | 描述 -------------------------------------------------public | test | …

ANSYS——模態提取方法簡介

目錄 block lancoze法 supspace(子空間法) powerdynamics reduced(縮減法) unsymmetric(非對稱法) 阻尼法和QR阻尼法

python 使用小知識總結(持續更新ing)

這篇博客主要針對于使用python來進行深度學習/機器學習過程各方面小知識的總結。習慣于使用C這種嚴謹的語言&#xff0c;改換到python這門相對來說開放式的語言需要很多學習&#xff0c;而作為一個菜雞&#xff0c;遇到編程問題解決了之后不到一周就會忘記&#xff0c;在此僅作…

Fifth scrum meeting - 2015/10/30

概述 從昨天開始&#xff0c;我們的開發工作終于進入了正軌&#xff0c;由于之前沒有mooc服務器API接口&#xff0c;一些工作無法進行。 因為我們團隊開始開發較晚&#xff0c;因此我們將開發階段的截至時間定為了下周五&#xff0c;測試階段則壓縮為下周周六和周日兩天。 我們…

計算機加入域 不能訪問網絡位置 解決辦法

計算機加入域 不能訪問網絡位置 解決辦法 啟動以下服務 本文轉自 onesthan 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/91xueit/1660286&#xff0c;如需轉載請自行聯系原作者

ANSYS——模態分析的載荷施加問題以及約束的施加問題

本文續自《ANSYS入門——模態分析步驟與實例詳解》:https://blog.csdn.net/qq_45769063/article/details/106389171 目錄 1.模態分析的激勵是從哪里來的?