1. 程式人生 > >JAVA的23種設計模式---原型模式

JAVA的23種設計模式---原型模式

概要:

該文章參考了《設計模式之禪》一書及一些前輩的部落格文章

1.該文章闡述了原型模式的基礎原理及示例程式碼;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;

正文:

原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件

1.原型模式示例程式碼實現:

package com.csdn;
/**
 * 廣告信內容類
 * @author Administrator
 *
 */
public class AdvTemplate {
    //廣告信名稱    
    private String advSubject ="CSDN官網活動推廣"
; //廣告信內容 private String advContext = "CSDN官網活動通知:...."; //取得廣告信的名稱 public String getAdvSubject(){ return this.advSubject; } //取得廣告信的內容 public String getAdvContext(){ return this.advContext; } }
package com.csdn;
/**
 * 郵件類
 * @author
Administrator * */
public class Mail implements Cloneable{ //收件人 private String receiver; //郵件名稱 private String subject; //稱謂 private String appellation; //郵件內容 private String contxt; //郵件的尾部,一般都是加上"XXX版權所有"等資訊 private String tail; //建構函式
public Mail(AdvTemplate advTemplate){ this.contxt = advTemplate.getAdvContext(); this.subject = advTemplate.getAdvSubject(); } //重寫克隆方法 @Override public Mail clone(){ Mail mail =null; try { mail = (Mail)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return mail; } //以下為getter/setter方法 public String getReceiver() { return receiver; } public void setReceiver(String receiver) { this.receiver = receiver; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getAppellation() { return appellation; } public void setAppellation(String appellation) { this.appellation = appellation; } public String getContxt() { return contxt; } public void setContxt(String contxt) { this.contxt = contxt; } public String getTail() { return tail; } public void setTail(String tail) { this.tail = tail; } }
package com.csdn;

import java.util.Random;
/**
 * 傳送郵件類,實現克隆郵件物件、多執行緒
 * @author Administrator
 *
 */
public class SendMail implements Runnable {
    @Override
    public void run() {
        //把模板定義出來,這個是從資料中獲得    
        Mail mail = new Mail(new AdvTemplate()); 
        mail.setTail(".....");
        //以下是每封郵件不同的地方,由於克隆的每個郵件物件都是新的實體,無需加鎖
        Mail cloneMail = mail.clone(); 
        cloneMail.setAppellation(getRandString(5)+" 先生(女士)");    
        cloneMail.setReceiver(getRandString(5) + "@" + getRandString(8)+".com");                
        //然後傳送郵件    
        sendMail(cloneMail);             
    }

    //傳送郵件    
    public static void sendMail(Mail mail){    
        System.out.println("標題:"+mail.getSubject() + "\t" + "收件人:"+mail.getReceiver() + "\t" + "....傳送成功!");    
    }   

    //獲得指定長度的隨機字串來模擬收件人,實際專案中從資料庫讀取收件人
    public static String getRandString(int maxLength){    
        String source ="abcdefghijklmnopqrskuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";    
        StringBuffer sb = new StringBuffer();    
        Random rand = new Random();    
        for(int i= 0 ; i < maxLength ; i++){    
            sb.append(source.charAt(rand.nextInt(source.length())));    
        }    
        return sb.toString();           
    }
}
package com.csdn;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 模擬群發郵件
 * @author Administrator
 *
 */
public class Client {
    //傳送郵件的數量,這個值是從資料庫中獲得    
    private static int MAX_COUNT = 10;          
    public static void main(String[] args) {   
        //建立定長執行緒池,指定執行緒數為5個
        ExecutorService service = Executors.newFixedThreadPool(5);
        //建立郵件的實體物件
        SendMail sMail = new SendMail();
        //傳送郵件
        for(int i = 0 ; i < MAX_COUNT ; i++){
            //提交任務
            service.submit(sMail);
        }
        //關閉執行緒池,之前的任務還是會正常執行結束,但是會拒絕之後的任務
        service.shutdown();
    }   
}

輸出:

標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!
標題:CSDN官網活動推廣   收件人:[email protected]  ....傳送成功!

注:
a:輸出內容每次都是不一樣的,因為收件人隨機
b:物件拷貝時建構函式不會被執行
c:Object提供的clone只拷貝本物件,其他的原始型別都會被拷貝,對其內部的陣列、引用物件等都不拷貝,還是指向原生物件的內部元素地址
d:String處理機制比較特殊,使用時可以當做基本類
e:淺度複製與深度克隆

2.通用原型模式模板程式碼實現:

package com.csdn;

public class PhototypeClass implements Cloneable{
    //重寫父類Object方法
    @Override
    public PhototypeClass clone(){
        PhototypeClass phototypeClass = null;
        try{
            phototypeClass = (PhototypeClass)super.clone();
        }catch(CloneNotSupportedException e){
                //異常處理
        }
        return phototypeClass;
    }
}

相關推薦

java23設計模式——四、原型模式

原始碼在我的[github](https://github.com/witmy/JavaDesignPattern)和[gitee](https://gitee.com/witmy/JavaDesignPattern)中獲取 # 目錄 [java23種設計模式—— 一、設計模式介紹](https://www.

java23設計模式3(轉)

訂閱 esp 兩個類 叠代器 請求 是個 plus 集合類 統一 本章是關於設計模式的最後一講,會講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、叠代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

java23設計模式2(轉)

是把 希望 sources 23種設計模式 接口 聯系 適合 () 創建 我們接著討論設計模式,上篇文章我講完了5種創建型模式,這章開始,我將講下7種結構型模式:適配器模式、裝飾模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。其中對象的適配器模式是各種模式的起源,我

(轉載)24設計模式--原型模式【Prototype Pattern】

dex clone() new t 分享圖片 object try arr 建立 不同 今天我們來講原型模式,這個模式的簡單程度是僅次於單例模式和叠代器模式,非常簡單,但是要使用好這個模式還有很多註意事項。我們通過一個例子來解釋一下什麽是原型模式。   現在電子賬單越來越流

Java23設計模式

生產 抽象工廠模式 com void 適配 依賴倒轉 mman rgs ati 一、設計模式的分類 分類 設計模式 創建型 工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、建造者模式(Builder)、原型模式(P

JAVA23設計模式六大原則,資料結構演算法強化訓練

目錄: 設計模式六大原則(1):單一職責原則 設計模式六大原則(2):里氏替換原則 設計模式六大原則(3):依賴倒置原則 設計模式六大原則(4):介面隔離原則 設計模式六大原則(5):迪米特法則 設計模式六大原則(6):開閉原則 設計模式六大原則(1):單一職責原則 定義:不要存在多於一個導致

java23設計模式之代理模式

什麼是代理?   簡單的來說就把通過第三方來完成一件事。 代理分為: 1.靜態代理     2.動態代理 1.靜態代理  * 1.定義抽象行為的類【抽象類、介面】  * 2.定義具體的實現類實現抽象方法  * 3.定

java23設計模式之策略設計模式

何為策略設計模式? 將可變的部分抽象為介面,在該介面的實現類裡面實現抽象的具體演算法,並使他們可以相互轉換。 策略設計模式的優點? 策略設計模式將普通的判斷語句的抽象出來,如果後續還有其他情況那麼是需要再加一個實現類就可以了,不會影響其他已經編譯的檔案。說白了就是擴充套件性很好,提高

java23設計模式之建立型設計模式(5

 23種設計模式可以分為三類:建立型模式、結構性設計模式、行為型設計模式。 本文將會從淺至深的講解建立型設計模式。 建立型設計模式有: AbstractFactory ( 抽象工廠 ) FactoryMethod ( 工廠方法 ) Singleton ( 單態模式 ) Builde

java23設計模式-訪問者模式

定義 封裝一些作用於某種資料結構中各元素的操作,它可以在不改變這個資料結構的前提下定義作用於這些元素的新的操作。 UML 角色 Visitor : 抽象訪問者介面 Element : 被訪問元素介面 ElementA,Element

java23設計模式-中介者模式

定義 用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。 角色 Colleague:是一個抽象類或者介面,提供和其他Colleague通訊的方法 notify(String nam

23設計模式-原型模式(3)

原創作者: chenssy  出處: http://www.cnblogs.com/chenssy/  本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。 以前聽過這樣一句話:“程式設計師的

java23設計模式-直譯器模式

定義 給定一個語言,定義它的文法表示,並定義一個直譯器,這個直譯器使用該標識來解釋語言中的句子 UML 角色 抽象表示式(Expression):宣告一個所有的具體表達式角色都需要實現的抽象介面。該介面提供一個interpret()方法。 終結符表

java23設計模式-介面卡模式

定義 介面卡模式是把一個類的介面轉換成客戶所期望的另一種介面,從而使原本不匹配而無法在一起工作的兩個類可以一起工作。 UML 角色 Target: 符合客戶端期望的介面。 Adaptee: 需要被適配的類。此類包含了客戶端想要實現的大部分功能,但並不能完

java23設計模式-門面(外觀)模式

定義 外觀模式為子系統的一組介面提供一個一致的介面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 UML 角色 子系統(SubSystem): 表示一個系統的子系統或者模組 門面(Facade): 客戶端通過門面間接控制子系統。門面遮蔽

java23設計模式-代理模式

定義 為其他物件提供一種代理以控制對這個物件的訪問。在某些情況下,一個物件不適合或者不能直接引用另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用。 UML 角色 Target: 被代理類的介面。 TargetImpl: 被代理類的實現。 T

java23設計模式-組合器模式

定義 將物件組合成樹形結構以表示“部分整體”的層次結構。組合模式使得使用者對單個物件和組合物件的使用具有一致性。–GoF《設計模式》 UML 角色 Component: 組合中的物件宣告介面,在適當的情況下,實現所有類共有介面的預設行為。宣告一個介面用於

Java23設計模式之:策略模式和工廠模式

因為目前產品用到了策略模式,比如國內的使用者註冊走A流程,美國使用者走B流程,印度使用者走C流程,每個流程有些相同,有些則完全不一樣。 這兩種設計模式非常容易弄混淆。   策略模式和工廠模式: 1. 關注點不一樣,工廠模式關注物件建立,策略模式關注行為封裝 2.解決的問題不

Java23設計模式【1】----》單例模式

23種模式分類: 模式:固定的套路 面向物件重要的模式 一、原理 保證一個類只有一個物件,並且提供一個全域性的訪問點 二、應用場景 三、優點 記憶體佔用小  四、最好擁有的特點 執行緒安全,呼叫效率高,懶載入----》推薦使用靜態內部類實現 五、常

java23設計模式教程

一、設計模式的分類 總體來說設計模式分為三大類: 建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。 行為型模式,共十一種:策略模式、模板方法模