1. 程式人生 > >Java-設計模式-第六篇-原型複製模式

Java-設計模式-第六篇-原型複製模式

本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。

類圖

    

為什麼使用原型複製模式

    我們知道在很多的類中,我們需要這個了類去持有其他類的物件,又或者構成某一個類的物件十分複雜。又或者,你想解耦框架與生成的例項時,比如說下面我們是根據字串指定要生成的例項,這樣我們就可以把client封裝到框架中,而不用因為new Something();必須導包,限制生成例項了。將框架從類名的約束中解放出來。

示例程式碼

package com.qiang.inte;

/**
 * 複製功能的介面
 *
 * @author zhangxinqiang
 * @date 2018/5/28
 */
public interface Product extends Cloneable {
    /**
     * 介面定義的某種功能
     *
     * @param string 引數
     */
    void use(String string);

    /**
     * 原型複製的方法,用於自我複製
     *
     * @return 你要複製的物件
     */
    Product createClone();
}
package com.qiang.inte.impl;

import com.qiang.inte.Product;

/**
 * 盒子產品
 *
 * @author zhangxinqiang
 * @date 2018/5/28
 */
public class BoxProduct implements Product {
    @Override
    public void use(String string) {
        System.out.println("我用包裝盒精美的包裝著:" + string);
    }

    /**
     * 原型複製的方法,用於自我複製
     *
     * @return 盒子產品
     */
    @Override
    public Product createClone() {
        Product product = null;
        try {
            product = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }
}
package com.qiang.inte.impl;

import com.qiang.inte.Product;

/**
 * 塑料袋產品
 *
 * @author zhangxinqiang
 * @date 2018/5/28
 */
public class PlasticBagsProduct implements Product {
    @Override
    public void use(String string) {
        System.out.println("我用塑料袋裝著:" + string);
    }

    /**
     * 原型複製的方法,用於自我複製
     *
     * @return 塑料袋產品
     */
    @Override
    public Product createClone() {
        Product product = null;
        try {
            product = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return product;
    }
}
package com.qiang;

import com.qiang.inte.Product;

import java.util.HashMap;

/**
 * 註冊中心
 *
 * @author zhangxinqiang
 * @date 2018/5/28
 */
public class Register {
    private HashMap<String, Product> register = new HashMap<>();

    /**
     * 向註冊中心註冊原型
     *
     * @param name    原型的名字
     * @param product 原型
     */
    public void regist(String name, Product product) {
        register.put(name, product);
    }

    /**
     * 獲取一個新的例項
     *
     * @param name 原型名字
     * @return 例項
     */
    public Product getInstance(String name) {
        Product product = register.get(name);
        return product.createClone();
    }
}
package com;

import com.qiang.Register;
import com.qiang.inte.Product;
import com.qiang.inte.impl.BoxProduct;
import com.qiang.inte.impl.PlasticBagsProduct;

/**
 * 測試類
 *
 * @author zhangxinqiang
 * @date 2018/5/28
 */
public class Test {
    public static void main(String[] args) {
        //進行註冊
        Register register = new Register();
        BoxProduct boxProduct = new BoxProduct();
        PlasticBagsProduct plasticBagsProduct = new PlasticBagsProduct();
        register.regist("box", boxProduct);
        register.regist("plastic", plasticBagsProduct);

        //獲取物件做事
        Product box1 = register.getInstance("box");
        box1.use("香蕉");
        Product box2 = register.getInstance("box");
        box2.use("香蕉");
        System.out.println(box1+"  !=  "+box2);

        Product plastic1 = register.getInstance("plastic");
        plastic1.use("香蕉");
        Product plastic2 = register.getInstance("plastic");
        plastic2.use("香蕉");

        System.out.println(plastic1+"  !=  "+plastic2);
    }
}

執行結果

我用包裝盒精美的包裝著:香蕉
我用包裝盒精美的包裝著:香蕉
[email protected]  !=  [email protected]
我用塑料袋裝著:香蕉
我用塑料袋裝著:香蕉
[email protected]  !=  [email protected]

思考一下

    每一個實際的產品都要去重複的書寫createClone()方法,我們是不是可以通過模板模式來稍微修改一下呢,那樣的話,我們再寫具體的產品時,只要主義寫產品的內部邏輯就可以了,而不用去關注clone了呢。

    CloneAble介面內部並沒有任何方法,它只是起到標記作用,只有實現了這個介面的類,才可以呼叫Object類中的clone()方法。

(最近加班非常多,個人精力跟不上,更新會慢很多...)

相關推薦

Java-設計模式--原型複製模式

本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。類圖    為什麼使用原型複製模式    我們知道在很多的類中,我們需要這個了類去持有其他類的物件,又或者構成某一個類的物件十分複雜。又或者,你想解耦框架與生成的例項時,比如說下面我們是根據字串指定要生成的例項,這樣我們

設計模式-命令模式

一、引言 先看需求:設計一個家電遙控器系統,每個家電由開、關兩個按鈕控制, 每個家電都由各自的廠商提供了實現方法,我們只需要呼叫這些方法即可,如圖所示: 如何實現這個功能呢? 第一步我們要排除的實現方式就是if條件判斷,因為一旦增加家電,我們就必須修改程式碼,這不符合我們的設計思路。 然後我們想想

java基礎知識--

一:繼承(extends) 1.如何表達這個關係呢? 通過extends關鍵字可以實現類與類的繼承 格式: class 子類名 extends 父類名 {}  父類:基類,超類 子類:派生類       &nbs

設計模式-裝飾者模式

一、引言 先看一個開發問題,很多人都玩過英雄聯盟這款遊戲:裡面有各種英雄,每個英雄都有各自的技能(一般是4個主動技能),每升一級可以升級一個技能,但是可升級的技能不固定。我們需要通過技能狀態來計算傷害,這個時候組合就非常多了(理論上是英雄數*技能數)。如果用繼承來解決的話,那麼子類就爆炸多了。 除了繼承還

設計模式-十責任鏈模式

1. 定義      責任鏈模式的定義:Avoid  couping the sender of a request to its receiver by giving more than one object a chance to handle the request.

設計模式-單例模式

實例化 git 面試 turn 性能 垃圾 容易 調用 存在 一、引言 單例模式應該是設計模式中比較簡單的一個,因為這個模式只有一個類,但不要小看這個設計模式,這個模式可是面試的時候很常見的一個。 單例模式有什麽的用處:有一些對象我們只需要一個的時候,比如線程池,緩存,註冊

設計模式3:生成器模式(Builder)

一.生成器模式要解決的問題   生成器模式主要解決工廠方法模式和抽象工廠模式在所建立的物件包含大量的屬性時所面臨的問題: 當客戶端程式向工廠類傳遞大量引數時很容易發生錯誤,因為很多引數的型別有可能是相同的,並且也很難保證傳遞引數的順序。 在傳遞引數時有些引數是可選的,但是在工廠設計模式中,所有的

設計模式5:介面卡模式

一.介面卡模式要解決的問題 介面卡模式屬於結構設計模式,我們把將兩個不相關的介面做一個適配以使二者進行互動的介面成為介面卡。比如充電器就是一個介面卡,正常電源是120V,手機電池輸入電壓是3V,電瓶車電池輸入電壓為20V,空調輸入電壓為120V,通過介面卡適配,可以將120V電源轉換為3V、20V、120V

Java併發程式設計 | :Future模式

一、什麼是Future模型 常見的多執行緒設計模式有:單例模式、不變模式、生產者-消費者模式、Future模式;而這裡介紹Future模式,它的核心思想就是非同步呼叫。當我們需要呼叫一個函式,但是這個函式執行很慢,如果我們不需要馬上知道結果,我們可以立即返回,

深入理解Java虛擬機器 | :虛擬機器位元組碼執行引擎

執行引擎是Java虛擬機器最核心的組成部分之一。“虛擬機器”是一個相對於“物理機”的概念,這兩種機器都有程式碼執行能力,其區別是物理機的執行引擎是直接建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系

多執行緒設計模式 - ThreadLocal和Active Object模式

一,ThreadLocal         Java 中的 ThreadLocal 類給多執行緒程式設計提供了一種可以讓每個執行緒具有自己獨立空間的機制,在這個空間記憶體儲的資料是執行緒特有的,不對外共享。  &nb

多線程設計模式 - ThreadLocal和Active Object模式

note active 計算 news 設計模式 簡化 Language return 通過 一,ThreadLocal Java 中的 ThreadLocal 類給多線程編程提供了一種可以讓每個線程具有自己獨立空間的機制,在這個空間內存儲的數據是線程特有的

設計模式4原型設計模式

一.原型設計模式要解決的問題   當建立一個物件需要大量的時間和資源時,這時如果已經存在一個類似的物件,我們就應該考慮原型設計模式。原型設計模式通過拷貝一份已經存在的物件並根據自己的需要來修改該物件,該模式要求複製的物件本身需要有複製特性,它不應該被其他類去複製。java中的原型設計模式通過克隆來實現,具體

設計模式:來康康介面卡模式

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a73dba64615d49249969470f7b2d52b3~tplv-k3u1fbpfcp-zoom-1.image) # 一 引言 設計模式就是一種思想,一種設計方式,他可以幫助我們對於一些

設計模式)——原型模式

設計模式 原型模式設計模式(六)——原型模式一、原型模式簡介1、原型模式簡介 原型模式使用原型實例指定創建對象的種類,並且通過拷貝原型對象創建新的對象。 Prototype模式提供了一個通過已存在對象進行新對象創建的接口(clone), clone()實現和具體的語言相關,在C++中通過拷貝構造函

201671010116. 2016-2017-6《Java程序設計周學習總結

port 信息 語法 dex 實現接口 默認 對象 語言 以及 本周通過老師的課堂講解以及假期的學習,知識點總結如下: 1.回調可以指出某個特定事件發生時應該采取的動作。 以構造定時器為例: 在很多程序設計語言中,可以提供一個函數名,定時器周期性的調用它。但Java標準類庫

201621123021《JAVA程序設計周學習總結

包含 log 不能 在外 希望 -c 註意 段落 定義 201621123021《JAVA程序設計》第六周學習總結 1. 本周學習總結 1.1 面向對象學習暫告一段落,請使用思維導圖,以封裝、繼承、多態為核心概念畫一張思維導圖或相關筆記,對面向對象思想進行一個總結。 面

20165318 2017-2018-2 《Java程序設計周學習總結

換行 compare integer 換行符 常用方法 tac 相等 student eve 20165318 2017-2018-2 《Java程序設計》第六周學習總結 教材內容學習總結 第八章 常用實用類 1、String類 String類用來處理字符序列,在java

20172325 2017-2018-2 《Java程序設計周學習總結

clas 設計 別人 list lis 打分 調用 照片 參考資料 20172325 2017-2018-2 《Java程序設計》第六周學習總結 教材學習內容總結 1.利用[ ]建立一個數組,整列數據可以通過數組名引用,數組中的每個元素則可以通過其在數組中的位置引用; 2.

設計模式就該這麽學:以微信訂閱號來講觀察者模式()

lis 圖片 自動重啟 bool 如果 微信 html .info void 前言:繼續《設計模式就該這麽學》系列文章,今天以當前比較火的微信訂閱號給大家介紹應用得比較多的一種設計模式——觀察者模式,之後再來介紹java拉模型方式的內置設計模式實現,最後附帶一個項目實際觀