標籤:硬體 跳過 覆蓋 個數 ret return 原型設計 stat 這一
走穿java23種設計模式-5原型模式
原型模式很多人對這個設計模式也是不熟悉的。因為用得也是不多,原型模式一般用於多次建立一個類的對象,擷取多個這個類的對象,並進行相應的操作,一般做法是多次new出來,但是原型模式是複製第一次建立的對象,然後通過多次複製得到多個對象。這種需求可能在現實需求中比較少,但是瞭解多一點沒什麼錯。。。
原型模式的現實情境
比如要通知幾十個客戶有買車的實惠資訊。
你不會笨到一個個客戶去給他單獨的寫郵件和郵件裡面的資訊吧。
好一點的做法就是寫好一封郵件內容,發給第一個客戶。
如果內容發送正常,就上一次發送的郵件資訊轉寄或複製給剩下的幾十個客戶的郵箱裡面。
上面就是一次原型模式的類比情況。
原型模式的定義
用原型執行個體指定建立對象的種類,並且通過複製這些原型建立新的對象。
原型模式的類圖
1
原型模式設計到三種角色
1.客戶角色
該角色提出建立對象的請求。
2.抽象原型角色
該角色是一個抽象角色,通常由一個java介面或抽象類別實現,給出所有的具體原型類所需要的介面。
3.具體原型角色
該角色是被複製的對象,必須實現抽象原型介面。
原型模式的優點/缺點
1.效能最佳化
原型模式使對記憶體中二進位流的拷貝,要比直接new一個對象效能好,特別使當一個迴圈體內產生大量的對象時,原型模式可以更好地體現其優點。
2.逃避建構函式的約束。
這既是優點,也是缺點,直接在記憶體中拷貝對象,建構函式是不會執行的,因此減少了約束,但是也有可能造成沒有對一些資料繼續必要的初始化,這一點要在實際應用中進行權衡考慮。
原型模式的應用情境
1.資源最佳化情境。
類初始化時需要消化非常多的資源,這個資源套件括資料、硬體資源等等,原型模式就能跳過這些步驟。
2.效能和安全要求的情境。
如果通過new來產生一個對象需要非常繁瑣的資料準備和存取權限,則可以通過原型模式。
3.一個對象多個修改者的情境。
一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮原型模式拷貝多個對象供調用者使用。
java複製對象
java中內建了複製機制。Object類具有一個clone()方法,能夠實現對象的複製。
使一個類支援複製只需要兩步。
1.實現介面Cloneable類
2.覆蓋Object的clone()方法,完成對象的複製操作,通常只需要調用Object的clone()方法即可。
為了使外部能夠調用此類的clone()方法,可以將存取修飾詞改為public。
原型設計模式的執行個體
這裡就以通知多個客戶的情況做樣本。
原型模式執行個體類圖
1
各個介面/類的代碼
1.抽象原型角色介面:Cloneable
這是系統的介面類,直接實現它就可以了
2.具體原型角色:Email
package p5_prototype;
/**
* 繼承了Cloneable 介面的類
* 用於完成對象的複製
* 完成通過自身對象複製出一個新的對象
*/
public class Email implements Cloneable {
//郵件的基本資料
private String receiver;//郵件的接收人
private String title;//郵件標題
private String contxt;//郵件內容
/**
* 構造方法
*/
public Email(String title,www.xbylpt5.cn String contxt) {//因為標題和內容一樣
this.title = title;
this.contxt = www.lgzxyl.com contxt;
}
/**
* 複製方法
* 複製對象的具體實現
* 覆蓋掉原本的clone方法
* 通過自身對象調用clone方法,可以得到新的對象
*/
public Email clone() {
Email email = null;
try {
email = (Email) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return email;
}
//get和set方法,不管是new出來的對象還是複製出來的對象都是可以調用下面的方法
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getTitle() {
return title;
}
public void setTitle(String www.wmyld11.cn title) {
this.title = title;
}
public String getContxt() {
return contxt;
}
public void setContxt(String contxt) {
this.contxt = contxt;
3.客戶角色:BenzClient
package p5_prototype;
import java.util.ArrayList;
import java.util.List;
/**
* 原型的客戶,接手郵件
*/
public class BenzClient {
List<String> receiverList = new ArrayList<String>();//要發送的收件者的集合
/**
* 在集合中添加收件者
*/
public List<String> getEmeilList(www.hjd1956.com/) {
receiverList.add("李先生");
receiverList.add("梁小姐");
receiverList.add("習先生");
receiverList.add("大飛機");
return receiverList;
}
/**
* 發送郵件的方法
* 類比發送。。。
*/
public void sendEmail(Email email) {
System.out.println("發送郵件給:" + email.getReceiver() + ",標題:" + email.getTitle() + ",內容:" + email.getContxt());
我這裡是把客戶群體當成是一個對象。
4.原型模式的調用類:PrototypeDemo
package p5_prototype;
/**
* 原型模式的調用者,客戶
*/
public class PrototypeDemo {
public static void main(String[] srgs) {
//建立一個Email原型,用來被複製
Email email = new Email("買車優惠活動", "十一期間買車就送一個超級大娃娃");
BenzClient client = new BenzClient();//客戶對象,內送郵件
//給所有使用者發送郵件
int num = client.getEmeilList().size();//客戶的個數
for (int i = 0; i < num; i++) {
Email copyEmail = email.clone();//根據對象複製新的對象
String receiver = client.getEmeilList().get(i);//擷取集合中的收件者
copyEmail.setReceiver(receiver);//給郵件添加收件者
client.sendEmail(copyEmail);//發送郵件程式運行結果:
2
之前也詳細介紹過了java設計模式中的其他四種建立型模式:
建造者模式:http://blog.csdn.net/wenzhi20102321/article/details/78163855
抽象原廠模式:http://blog.csdn.net/wenzhi20102321/article/details/78153437
Factory 方法模式:http://blog.csdn.net/wenzhi20102321/article/details/78129065
可以仔細對比一下Factory 方法模式和抽象原廠模式,看看概念,看看類圖,看看代碼,就會明白了。
單例模式:http://blog.csdn.net/wenzhi20102321/article/details/77882203
java 23種設計模式介紹:http://blog.csdn.net/wenzhi20102321/article/details/54601909
國慶假期馬上就要結束了。。。
共勉:爭取更加美好的未來。
走穿java23種設計模式-5原型模式