前言 :
轉載自 這裡
有些物件若以標準的方式建立實例,或者是設定至某個狀態需要複雜的運算及昂貴的資源,則您可以考慮直接以某個物件作為原型,在需要個別該物件時,複製原型並傳回。
請注意,在這邊Cloneable並非指Java中的java.lang.Cloneable,而是指支援原型複製的物件,必須實作之公開協定。
不 同的語言可能提供不同程度支援之物件複製技術,以Java而言,java.lang.Object本身即定義有clone()方法,因此所有的物件基本上 皆具自我複製之能力,不過真正要讓物件支援複製,則物件必須實作 java.lang.Cloneable 這個標示介面(Tag interface)
範例代碼 :
下面這個範例示範了,如何使用Java實作Prototype模式(建議您參考:How to avoid traps and correctly override methods from java.lang.Object):
執行結果 :
補充說明 :
* Wiki : Prototype pattern
轉載自 這裡
有些物件若以標準的方式建立實例,或者是設定至某個狀態需要複雜的運算及昂貴的資源,則您可以考慮直接以某個物件作為原型,在需要個別該物件時,複製原型並傳回。
請注意,在這邊Cloneable並非指Java中的java.lang.Cloneable,而是指支援原型複製的物件,必須實作之公開協定。
不 同的語言可能提供不同程度支援之物件複製技術,以Java而言,java.lang.Object本身即定義有clone()方法,因此所有的物件基本上 皆具自我複製之能力,不過真正要讓物件支援複製,則物件必須實作 java.lang.Cloneable 這個標示介面(Tag interface)
範例代碼 :
下面這個範例示範了,如何使用Java實作Prototype模式(建議您參考:How to avoid traps and correctly override methods from java.lang.Object):
- package ch09.car;
- import java.util.*;
- class Wheel implements Cloneable{
- public Wheel(){
- System.out.println("Wheel constructor is called!");
- };
- // 也許還有一些複雜的設定
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
- class Car implements Cloneable{
- private String name="Unknown";
- public Car(){
- System.out.println("Car constructor is called!");
- }
- public Car(String n) {
- name = n;
- System.out.printf("Car:%s constructor is called!\n", n);
- }
- // 也許還有一些複雜的設定
- private Wheel[] wheels = {new Wheel(), new Wheel(), new Wheel(), new Wheel()};
- protected Object clone() throws CloneNotSupportedException {
- Car copy = (Car) super.clone();
- copy.wheels = (Wheel[]) this.wheels.clone();
- for(int i = 0; i < this.wheels.length; i++) {
- copy.wheels[i] = (Wheel) this.wheels[i].clone();
- }
- return copy;
- }
- public String getName(){
- return name;
- }
- }
- class Cars {
- private Map
prototypes = new HashMap(); - void addPrototype(String brand, Car prototype) {
- prototypes.put(brand, prototype);
- }
- Car getPrototype(String brand) throws CloneNotSupportedException {
- return (Car) prototypes.get(brand).clone();
- }
- }
- public class Main {
- public static void main(String[] args) throws Exception {
- Car bmw = new Car("BMW");
- // 作一些 BMW 複雜的初始、設定、有的沒的
- Car benz = new Car("BENZ");
- // 作一些 BENZ 複雜的初始、設定、有的沒的
- Cars cars = new Cars();
- cars.addPrototype("BMW", bmw);
- cars.addPrototype("BENS", benz);
- // 取得 BMW 原型複製, Constructor 不會被呼叫.
- System.out.println("\t>>>Clone Car Type:BMW");
- Car bmwPrototype = cars.getPrototype("BMW");
- System.out.printf("Prototype Car(%s)\n", bmwPrototype.getName());
- }
- }
補充說明 :
* Wiki : Prototype pattern
This message was edited 8 times. Last update was at 17/05/2010 13:32:35
沒有留言:
張貼留言