設計模式-原型模式(06)

来源:http://www.cnblogs.com/aeolian/archive/2017/11/20/7853477.html
-Advertisement-
Play Games

定義 原型(Prototype Pattern)是一個簡單的設計模式。原型模式的英文原話是:Specify the kind of objects to create using a prototypical instance,and create new objects by copying th ...


定義

  原型(Prototype Pattern)是一個簡單的設計模式。原型模式的英文原話是:Specify the kind of objects to create using a prototypical instance,and create new objects by copying this prototype.意思是:用原型實例指定創建對象的種類,並且通過複製這些原型創建新的對象。

  原型模式有三種角色:

  1.客戶(Client)角色:該角色提出創建對象的請求。
  2.抽象原型(Prototype):該角色是一個抽象角色,通常由一個java介面或抽象類實現,給出所有的具體原型類所需要的介面。
  3.具體原型(Concrete Prototype)角色:該角色是被覆制的對象,必須實現抽象原型介面。

java中內置了克隆機制。object類具有一個clone()方法,能夠實現對對象的克隆,是一個類支持克隆只需要兩步:

  1.實現Cloneable介面。
  2.覆蓋Object的clone()方法,完成對象的克隆操作,通常只需要調用Object的clone()方法即可。為了使外部能夠調用此類的clone()方法,可以將訪問修飾符改為public。

/**
 * 抽象原型角色(Prototype)
 * 給出具體原型類複製所需要的介面
 */
public interface Prototype {
    //克隆方法
    Prototype clone();
}

/**
 * 具體原型工廠類
 * 
 */
public class ConcretePrototype implements Prototype {
    @Override
    public Prototype clone() {
        try {
            return (Prototype)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

public class Client {
    public void operation(Prototype example) {
        //得到example
        Prototype prototype = example.clone();
    }
}

原型模式的優點

  1.性能優良:原型模式是對記憶體中二進位流的拷貝,要比直接new一個對象性能好,特別是當一個迴圈體內產生大量的對象時,原型模式可以更好地體現其優點。

  2.逃避構造函數的約束。這既是優點也是缺點,直接在記憶體中拷貝對象,構造函數是不會執行的,因此減少了約束,不過這一點需要在實際應用時進行權衡考慮。

原型模式的使用場景

  1.資源優化場景,類初始化時需要消化非常多的資源,這個資源包括數據、硬體資源等。

  2.性能和安全要求的場景,如果通過new產生一個對象需要非常繁瑣的數據準備和訪問許可權,則可以使用原型模式。

  3.一個對象多個修改者的場景,一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值,可以考慮使用原型模式拷貝多個對象供調用者使用。

在實際項目中,原型模式很少單獨出現,一般是和工廠方法模式一起出現。原型模式通過clone()方法創建一個對象,然後由工廠方法提供給調用者。

例子

/**
 * 實現clone介面,實現了clone方法,是實現克隆的關鍵
 */
public class Mail implements Cloneable {
    //收件人
    private String receiver;
    //郵件標題
    private String subject;
    //稱謂
    private String appellation;
    //郵件內容
    private String contxt;
    //尾部
    private String tail;
    //構造函數
    public Mail(String subject,String contxt) {
        this.subject = subject;
        this.contxt = contxt;
    }
    //克隆方法
    public Mail clone() {
        Mail mail = null;
        try {
            mail=(Mail) super.clone();
            System.out.println(super.toString());   //super指的是被調用的那個對象
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return mail;
    }
}

/**
 * 調用
 */
public class SendMailDemo {
    Map students = new LinkedHashMap();
    public static void main(String[] args) {
        //創建一個原型mail
        Mail mail = new Mail("郵件標題", "郵件內容");
        mail.setTail("2017-11-20");
        SendMailDemo sendMailDemo = new SendMailDemo();
        //獲取所有學生
        Map students=sendMailDemo.getStudent();
        for (Object name : students.keySet()) {
            //克隆郵件
            Mail cloneMail = mail.clone();
            cloneMail.setAppellation(name.toString());
            cloneMail.setReceiver(students.get(name).toString());
            sendMailDemo.sendMail(cloneMail);
        }
        
    }
    public Map getStudent(){
        students.put("studentone", "[email protected]");
        students.put("studenttwo", "[email protected]");
        students.put("studentthree", "[email protected]");
        students.put("studentfour", "[email protected]");
        students.put("studentfive", "[email protected]");
        students.put("studentsix", "[email protected]");
        students.put("studentseven", "[email protected]");
        return students;
    }
    public void sendMail(Mail mail){
        System.out.println("標題:"+mail.getSubject()+"\t收件人郵箱:"+mail.getReceiver()+"\t正文:"+mail.getAppellation()+mail.getContxt()+"\t...已發送");
    }
}

源碼

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為了防止不提供原網址的轉載,特在這裡加上原文鏈接: "http://www.cnblogs.com/skabyy/p/7695258.html" 本篇將實現登錄、許可權控制、日誌配置與審計日誌的功能。首先我們先實現登錄功能,在登錄的基礎上,通過控權使得只有ID為1988的用戶才能創建tweet。最後配 ...
  • 返回總目錄 本小節目錄 Split Temporary Variable(分解臨時變數) Remove Assignments to Parameters(移除對參數的賦值) Remove Assignments to Parameters(移除對參數的賦值) 6 Split Temporary V ...
  • sae中安裝有python環境,想讓sae導入自己下載的django或者其他模塊,可以在svn中新建一個文件目錄,比如site-packages,跟python安裝目錄一樣,這個目錄存放所有的python模塊(包括django),將安裝目錄下的以及用pip install安裝的各種模塊copy入這個 ...
  • 本文主要介紹JDK環境配置、Sublime Text3配置及第一個HelloWorld.Java程式。運行環境為Win10系統,使用JDK1.8版本。 ...
  • VS2008創建MFC程式 1. 點擊菜單欄 文件 新建 項目 選擇MFC應用程式 MFC ActiveX 控制項用來生成MFC ActiveX控制項程式。 MFC應用程式用來生成MFC應用程式。 MFC DLL用來生成MFC動態鏈接庫程式。 2. 填好項目名稱,存儲位置後點擊確定進入MFC應用程式嚮導 ...
  • 1.深淺拷貝 在Python中將一個變數的值傳遞給另外一個變數通常有三種:賦值、淺拷貝、深拷貝 Python數據類型可氛圍基本數據類型包括整型、字元串、布爾及None等,還有一種由基本數據類型作為最基本的元素所組成的像列表、元組、字典等。 在Python中基本數據類型的賦值、深淺拷貝沒有任何意義,都 ...
  • 通過下麵一個例子進行理解。 運行結果: 分析: p = multiprocessing.Process(……)定義了五個進程,p.start五個進程並行,造成如圖的結果是信號量限制進程對臨界資源的訪問的原因。 s = multiprocessing.Semaphore(2)定義了信號量最大為2,re ...
  • 前言 今天要總結的就是Mybatis的相關簡單入門,並且使用這個持久化框架解決一些JDBC原生代碼產生的問題。 一、Mybatis介紹 MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation 遷移到了google code, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...