一般にインスタンスはクラスから生成します。しかしながら、クラスを用いて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
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
 - Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
 - PlantUML による UML 図の描き方
PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ... - Akka HTTP サンプルコード (Scala)
Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な - Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
 





