原型模式的java實現例子
說明:本文是《大話設計模式》一書的學習文摘和網上相關資訊文摘,原書程式碼例子用C#寫,下面用Java改寫。
1、原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
2、原型模式的UML類圖
3、在Java中原型模式變成clone()方法的使用,由於Java的純潔的面向物件特性,使得在Java中使用設計模式變得很自然,兩者已經幾乎是渾然一體了。
Java中物件的克隆:
(1)為了獲取物件的一份拷貝,我們可以利用Object類的clone()方法。
(2)在派生類中覆蓋基類的clone()方法,並宣告為public。
(3)在派生類的clone()方法中,呼叫super.clone()。
(4)在派生類中實現Cloneable介面。
4、在Java中,clone()方法是淺複製。
淺複製(淺克隆) :被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不復制它所引用的物件。
深複製(深克隆) :被複制物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複制過的新物件,而不再是原有的那些被引用的物件。換言之,深複製把要複製的物件所引用的物件都複製了一遍。
可以利用序列化來做深複製,所謂物件序列化就是將物件的狀態轉換成位元組流,以後可以通過這些值再生成相同狀態的物件。
5、下面實現一個簡歷的原型模式
package demo9; import java.io.*; /** * 簡歷類 * */ public class Resume implements Serializable,Cloneable { /** * */ private static final long serialVersionUID = 8614140644886700330L; private String name; private String sex; private Integer age; private WorkExperience work; public Resume(String name){ this.name = name; work = new WorkExperience(); } //設定個人資訊 public void setPersonalInfo(String sex, Integer age){ this.sex = sex; this.age = age; } //設定工作經歷 public void setWorkExperience(String workDate,String company){ work.setWorkDate(workDate); work.setCompany(company); } //顯示 public void display(){ System.out.println(String.format("%s %s %s", name,sex,age)); System.out.println(String.format("工作經歷:%s %s", work.getWorkDate(), work.getCompany())); } //淺複製 public Object clone(){ Object obj = null; try { obj = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } //深複製 public Object deepClone() throws IOException, ClassNotFoundException{ //將物件寫到流裡 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); //從流裡讀出來 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); } } package demo9; import java.io.Serializable; /** * 工作經歷類 * */ public class WorkExperience implements Serializable { private static final long serialVersionUID = -5461562344310808271L; private String workDate; public String getWorkDate() { return workDate; } public void setWorkDate(String workDate) { this.workDate = workDate; } private String company; public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } } package demo9; import java.io.IOException; /** * 客戶端呼叫 * */ public class Demo9 { public static void main(String[] args) throws ClassNotFoundException, IOException { Resume a = new Resume("大鳥"); a.setPersonalInfo("男", 29); a.setWorkExperience("1998-2000", "xx公司"); //淺複製 Resume b = (Resume)a.clone(); b.setWorkExperience("1998-2006", "yy公司"); b.setPersonalInfo("男", 25); a.display(); b.display(); // 執行結果:a和b的WorkExperience的引用值是一樣的 // 大鳥 男 29 // 工作經歷:1998-2006 yy公司 // 大鳥 男 25 // 工作經歷:1998-2006 yy公司 Resume c = new Resume("大鳥"); c.setPersonalInfo("男", 29); c.setWorkExperience("1998-2000", "xx公司"); //深複製 Resume d = (Resume)c.deepClone(); d.setWorkExperience("1998-2006", "yy公司"); d.setPersonalInfo("男", 25); c.display(); d.display(); // 執行結果:a和b的WorkExperience的引用值是不同的 // 大鳥 男 29 // 工作經歷:1998-2000 xx公司 // 大鳥 男 25 // 工作經歷:1998-2006 yy公司 } }
相關推薦
原型模式的java實現例子
說明:本文是《大話設計模式》一書的學習文摘和網上相關資訊文摘,原書程式碼例子用C#寫,下面用Java改寫。 1、原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 2、原型模式的UML類圖 3、在Java中原型模式變成clone()方法的使用,由
簡單工廠模式的java實現例子
說明:本文是《大話設計模式》一書的學習文摘和網上相關資訊文摘,原書程式碼例子用C#寫,下面用Java改寫。 1、簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法模式。 它的實現方式是由一個工廠類根據傳入的引數,動態決定應該建立哪一個產品類(這些產品類繼承自一個父類或介面)
工廠方法模式的java實現例子
說明:本文是《大話設計模式》一書的學習文摘和網上相關資訊文摘,原書程式碼例子用C#寫,下面用Java改寫。 1、工廠方法模式:定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。 核心工廠類不再負責產品的建立,這樣核心類成為一個抽象
模板模式的java實現例子 大象放入冰箱
最近在看《Thinking In UML大象》。看到裡面講介面設計的時候,舉了“把大象放入冰箱”的例子。自己順手就寫了一下,用到了模板模式 從main方法開始 public static void main(String[] args) { Refrige refr
觀察者模式及Java實現例子
觀察者模式 觀察者模式 Observer 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。 這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓它們能夠自動更新自己。 觀察者模式的組成 抽象主題角色:把所有對觀察者物件的引用儲存在一個集合中,每個抽象主題角色
裝飾模式的java實現例子
說明:本文是《大話設計模式》一書的學習文摘和網上相關資訊文摘,原書程式碼例子用C#寫,下面用Java改寫。 1、裝飾模式:在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 2、裝飾模式由4種角色組成:
設計模式之普通工廠模式(Java實現版本)
工廠模式是設計模式中非常容易理解的模式之一。簡單來說,工廠模式就是替代new操作的一種方式,比如我們去飯店要茶水,工廠就像是服務員,只要告訴服務員我要茶水,服務員就會把茶壺拿來,而不需要我們自己去拿茶水(好比於在main方法中直接new Tea();) 接下來貼上例子,為了方便,把所有的程式碼都
設計模式之單例模式(Java實現版)
單例模式作用在一個類上,這個類提供了一種方法來訪問它的唯一物件,可以直接訪問,而不需要例項化類的物件。單例模式的作用是保證一個類只有一個物件例項。 class Singleton { private static Singleton instance = new Singleton()
設計模式之抽象工廠模式(Java實現)
抽象工廠是一個超級工廠,用來建立其他工廠,又稱為工廠的工廠,也就是對各種不同的工廠再次進行抽象。在抽象工廠模式中,介面負責建立相關物件的工廠, 每個生成的工廠可以按照工廠模式提供物件。 首先建立兩個介面然後實現具體類 //再建立一個介面Plant interface Plant {
05:原型模式——C++實現
目錄 一、介紹 二、應用場景 三、要點 四、樣例 五、優缺點 一、介紹 原型模式(Prototype Pattern)是用於建立重複的物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。
設計模式-原型模式-C++實現
原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 場景: 1.這個類物件並不是一開始建立的,而是在執行過程中建立的,這樣比較適合原型模式; 2.當一個類的例項由不同的狀態組合的情況下。建立相應數目的原型並克隆他們在合適的的裝態下的例項。
設計模式之建造者模式-java實現
設計模式建造者模式的java實現類 第一步、建立一個要被構建的類 Persion類並宣告屬性 package com.chinamsp.mytest.pattern.builder; class Persion { private String name;
設計模式之原型模式——Java語言描述
原型模式是用於建立重複物件,同時又能保證效能。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的方式 這種模式實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則適合採用這種模式。 應用例項: 細胞分裂 Java中的Object.clone()方法
設計模式(一):單例模式 java實現
參考:http://blog.csdn.net/jason0539/article/details/23297037/ 單例模式:指的是一個類只有一個例項物件。它的設計是為了實現類的單一功能。專注於自己的事情。 有如下三個特點: 單例類只有一個
原型模式的簡單例子
定義:用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。 型別:建立類模式 原型模式主要用於物件的複製,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件: 實現Cloneable介面。在java語言有一個
橋接模式(java實現)
橋接模式 手機品牌M和N都有遊戲和通訊錄功能,都用繼承實現,程式碼如下. public class Brand { public void run() {} } public class MBrand extends Brand{ } public class NBran
六種常用的設計模式java實現(四)模板模式
模板模式,估計大家應該都接觸過,比如說,在完成某個業務邏輯前,需要處理一點事,在完成後也要處理一點事,這樣就可以把不一樣的地方給抽象出來,然後公共的地方都是一樣的,這樣的場景就會用到模板模式。 一、基本概念 模板方法模式是類的行為模式。準備一個抽象類,將部分
GOF23設計模式之原型模式之實現
/** * Sheep類,測試原型模式之淺拷貝 * 時間:2015年4月1日09:44:29 */ package com.bjsxt.cn.prototype; import java.io.Serializable; import java.util.D
生產者消費者模式-Java實現
感知階段 隨著軟體業的發展,網際網路使用者的日漸增多,併發這門藝術的興起似乎是那麼合情合理。每日PV十多億的淘寶,處理併發的手段可謂是業界一流。使用者訪問淘寶首頁的平均等待時間只有區區幾秒,但是伺服器所處理的流程十分複雜。首先負責首頁的伺服器就有好幾千臺,通過計算把
大話設計模式java實現
自己用java實現了一下大話設計模式一書中的各個模式。github地址:https://github.com/ssystc/DesignPattern.gitCSDN下載地址:https://download.csdn.net/download/u014627099/1053