1. 程式人生 > >原型模式的簡單例子

原型模式的簡單例子

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

型別:建立類模式
原型模式主要用於物件的複製,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件:

實現Cloneable介面。在java語言有一個Cloneable介面,它的作用只有一個,就是在執行時通知虛擬機器可以安全地在實現了此介面的類上使用clone方法。在java虛擬機器中,只有實現了這個介面的類才可以被拷貝,否則在執行時會丟擲CloneNotSupportedException異常。
重寫Object類中的clone方法。Java中,所有類的父類都是Object類,Object類中有一個clone方法,作用是返回物件的一個拷貝,但是其作用域protected型別的,一般的類無法呼叫,因此,Prototype類需要將clone方法的作用域修改為public型別。

    原型模式是一種比較簡單的模式,也非常容易理解,實現一個介面,重寫一個方法即完成了原型模式。在實際應用中,原型模式很少單獨出現。經常與其他模式混用,他的原型類Prototype也常用抽象類來替代。
[java] view plain copy
print?在CODE上檢視程式碼片派生到我的程式碼片

    class Prototype implements Cloneable {    
        public Prototype clone(){    
            Prototype prototype = null;    
            try{    
                prototype = (Prototype)super.clone();    
            }catch(CloneNotSupportedException e){    
                e.printStackTrace();    
            }    
            return
prototype; } } class ConcretePrototype extends Prototype{ public void show(){ System.out.println("原型模式實現類"); } } public class Client { public static void main(String[] args){ ConcretePrototype cp = new
ConcretePrototype(); for(int i=0; i< 10; i++){ ConcretePrototype clonecp = (ConcretePrototype)cp.clone(); clonecp.show(); } } }

使用原型模式建立物件比直接new一個物件在效能上要好的多,因為Object類的clone方法是一個本地方法,它直接操作記憶體中的二進位制流,特別是複製大物件時,效能的差別非常明顯。

   使用原型模式的另一個好處是簡化物件的建立,使得建立物件就像我們在編輯文件時的複製貼上一樣簡單。

   因為以上優點,所以在需要重複地建立相似物件時可以考慮使用原型模式。比如需要在一個迴圈體內建立物件,假如物件建立過程比較複雜或者迴圈次數很多的話,使用原型模式不但可以簡化建立過程,而且可以使系統的整體效能提高很多。

原型模式的注意事項

使用原型模式複製物件不會呼叫類的構造方法。因為物件的複製是通過呼叫Object類的clone方法來完成的,它直接在記憶體中複製資料,因此不會呼叫到類的構造方法。不但構造方法中的程式碼不會執行,甚至連訪問許可權都對原型模式無效。單例模式中,只要將構造方法的訪問許可權設定為private型,就可以實現單例。但是clone方法直接無視構造方法的許可權,所以,單例模式與原型模式是衝突的,在使用時要特別注意。
深拷貝與淺拷貝。Object類的clone方法只會拷貝物件中的基本的資料型別(8種基本資料型別byte,char,short,int,long,float,double,boolean),對於陣列、容器物件、引用物件等都不會拷貝,這就是淺拷貝。如果要實現深拷貝,必須將原型模式中的陣列、容器物件、引用物件等另行拷貝。例如:
    public class Prototype implements Cloneable {    
        private ArrayList list = new ArrayList();    
        public Prototype clone(){    
            Prototype prototype = null;    
            try{    
                prototype = (Prototype)super.clone();    
                prototype.list = (ArrayList) this.list.clone();    
            }catch(CloneNotSupportedException e){    
                e.printStackTrace();    
            }    
            return prototype;     
        }    
    }    

相關推薦

工廠模式簡單例子

void factor 不存在 dmi sta println static nis pack 工廠模式: 1 package factorymode; 2 /** 3 * 工廠模式簡單例子 4 * @author Administrator 5 * 6

java常用設計模式--觀察者模式簡單例子

package com.ruanyun;import java.util.List;import java.util.Vector;/** * @Auther: maxw * @Date: 2018/11/10 16:14 * @Description:觀察者模式 * 基本概念: * 觀察者模式屬於行為型模式

java常用設計模式--單例模式簡單例子

package com.ruanyun;/** * @Auther: maxw * @Date: 2018/11/10 17:29 * @Description: */public class Test4 { public static void main(String args[]){

java常用設計模式--工廠方法模式簡單例子

package com.ruanyun;/** * @Auther: maxw * @Date: 2018/11/12 11:02 * @Description:工廠方法模式:有四個角色,抽象工廠模式,具體工廠模式,抽象產品模式,具體產品模式。不再是由一個工廠類去例項化具體的產品,而是由抽象工廠的子類去例項化

java常用設計模式--抽象工廠模式簡單例子

package com.ruanyun;/** * @Auther: maxw * @Date: 2018/11/12 11:23 * @Description:抽象工廠模式:與工廠方法模式不同的是,工廠方法模式中的工廠只生產單一的產品,而抽象工廠模式中的工廠生產多個產品。 * 還有個抽象工廠方法模式 只需要

Java設計模式 - 原型模式簡單介紹及其例項應用

一:原型模式的定義?   定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。   簡單地講:給定一個原型物件來指明所要建立的物件的型別,然後用拷貝這個原型物件的方法來創建出更多的同類型物件。   二:JAVA中原型模式的實現? &n

策略模式簡單例子

以Head First設計模式中第一章給出的鴨子例子來講,此例子中有個鴨子的類,一共有普通鴨、模型鴨和玩具鴨三種。區別是普通鴨可以飛行併發出嘎嘎的叫聲;模型鴨不能飛行且不能發聲;玩具鴨不能飛行,但可以依靠火箭推進飛行(^..^就是這麼吊)且發出吱吱的聲音。面對這

C#設計模式---觀察者模式簡單例子

在開發過程中經常遇到一個模組中的 一個方法呼叫了其他模組中相關的方法 比如說在一個系統中,如果出現了錯誤,就呼叫專門進行錯誤處理的模組中的方法進行錯誤處理 而因為錯誤處理的操作有很多,所以將這些具體的操作封裝在其他的模組中 在專門進行錯誤處理的模組中呼叫其他模組中的錯誤操作

原型模式簡單介紹及其例項應用

一:原型模式的定義?定義:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。簡單地講:給定一個原型物件來指明所要建立的物件的型別,然後用拷貝這個原型物件的方法來創建出更多的同類型物件。二:JAVA中原型模式的實現?在JAVA裡,通過克隆(Clone())方法來實

原型模式簡單例子

定義:用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。 型別:建立類模式 原型模式主要用於物件的複製,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件: 實現Cloneable介面。在java語言有一個

JavaScript設計模式--簡單工廠模式例子---XHR工廠

++ 原型鏈 this soft microsoft for .proto 跨域 默認 第一步,Ajax操作接口(目的是起一個接口檢測作用) (1)引入接口文件 //定義一個靜態方法來實現接口與實現類的直接檢驗 //靜態方法不要寫出Interface.pro

關於js的設計模式簡單工廠模式,構造函數模式原型模式,混合模式,動態模式

nod nodejs 重新 作用域 this 一次 無法 typeof 訪問 <1>工廠模式 簡單來說就是封裝後的代碼,簡單的工廠模式是很好理解的,關於它的作用,就是利用面向對象的方法,把一些對象封裝,使一些占用空間多的,重復的代碼封裝起來。實現方法非常簡單,也

大話設計模式--裝飾模式 C++簡單例子

span 例子 簡單例子 new pre virt != code decorator 裝飾模式在對象動態增加功能方面優於繼承,用裝飾模式替代繼承,比繼承更加靈活。 小菜扮靚第三版 class person { public: virtual void show(

(二十三)原型模式詳解(clone方法原始碼的簡單剖析)

 作者:zuoxiaolong8810(左瀟龍),轉載請註明出處,特別說明:本博文來自博主原部落格,為保證新部落格中博文的完整性,特複製到此留存,如需轉載請註明新部落格地址即可。               &nbs

一個簡單例子解釋工廠模式建立物件

function createObject(name,age) { var obj=new Object(); obj.name=name; obj.age=age; obj.eat=function () { console.log(

設計模式之觀察者-Java(簡單例子

1、定義:源於GOF的Design Patterns一書。 Define a one-to-many dependency between objects so that when oneobject changes state, all its dependents are notifie

設計模式之策略模式淺談以及簡單例子

null 引用 == names bsp args cto 封裝 方法 設計模式之策略模式 策略模式定義了算法類,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。 策略模式是對算法的包裝,是把使用的責任和

設計模式簡單例子(三)行為型模式

終於,把設計模式小例子敲完了..... 原始碼已經上傳到了GitHub. https://github.com/tanglonghui/DesignPatterns 設計模式簡單小例子(一) 建立型模式: https://blog.csdn.net/qq_40687864/artic

設計模式簡單例子(二)結構型模式

簡單小例子 原始碼已經上傳到了GitHub. https://github.com/tanglonghui/DesignPatterns 設計模式簡單小例子(一) 建立型模式: https://blog.csdn.net/qq_40687864/article/details/810

C++設計模式——簡單工廠模式及具體應用(含例子

前言 Iphone 6即將面世過程中,富士康集團正在為Iphone6的面世做著最後的衝刺,生產線上的工人正忙碌著為Iphone6進行各道流程的加工操作。作為代工工廠,富士康為世界上IT巨頭,如:蘋果,惠普等加工出各種產品。市場上看到的各種品牌電腦,絕大部分來在富士康這