1. 程式人生 > >原型模式的java實現例子

原型模式的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