Prototypeパターンの実装例 (Java)
[履歴] (2013/08/21 08:24:36)
最近の投稿
注目の記事

概要

一般にインスタンスはクラスから生成します。しかしながら、クラスを用いて1からインスタンスを生成するよりも、雛形 (Prototype) となるインスタンスを用意しておき、それをコピーして (場合によってはさらに多少の変更を加えて) 使用したほうが便利なこともあります。

サンプルコード

sample.java

class Sample {
    public static void main(String args[]) {
        Client client = new Client();
        client.register("typeA", new ConcretePrototype('A'));
        client.register("typeB", new ConcretePrototype('B'));
        client.register("typeC", new ConcretePrototype('C'));

        Prototype p1 = client.create("typeA");
        Prototype p2 = client.create("typeB");
        Prototype p3 = client.create("typeC");
        p1.greet("hi");
        p2.greet("hi");
        p3.greet("hi");
    }
}

Client.java

import java.util.HashMap;

class Client {
    private HashMap<String,Prototype> hash = new HashMap<String,Prototype>();
    public void register(String key, Prototype proto) {hash.put(key, proto);}
    public Prototype create(String key) {return hash.get(key).createClone();}
}

Prototype.java

interface Prototype extends Cloneable {
    public abstract void greet(String s);
    public abstract Prototype createClone();
}

ConcretePrototype.java

class ConcretePrototype implements Prototype {
    private char val;
    public ConcretePrototype(char val) {this.val=val;}
    public void greet(String s) {
        int length = s.getBytes().length;
        for(int i=0; i<length; ++i) {System.out.print(val);}
        System.out.print(" ["+s+"] ");
        for(int i=0; i<length; ++i) {System.out.print(val);}
        System.out.println("");
    }
    public Prototype createClone() {
        Prototype p = null;
        try {p = (Prototype)clone();}
        catch(CloneNotSupportedException e) {e.printStackTrace();}
        return p;
    }
}

実行例

$ javac Client.java  ConcretePrototype.java  Prototype.java  sample.java && java Sample
AA [hi] AA
BB [hi] BB
CC [hi] CC
関連ページ