Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [⑥ Prototype]

概要

prototypeは日本語で「試作品」,「原型」という意味になる.Prototypeパターンは,新しいオブジェクトを作成する際に,既存のオブジェクト(インスタンス)を使用して複製するパターンである.

オブジェクトのインスタンス化のコストが高い場合や,システム内で多数の同じオブジェクトが必要な場合に有効である.

Prototypeパターンの主な要素は以下である.

  • Prototype:クローンメソッドを定義するインターフェース
  • ConcretePrototype:Prototypeインターフェースを実装するクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

javaimport java.util.Date;

// Prototype
abstract class Prototype implements Cloneable {
    abstract void operation();

    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        }
        catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

// ConcretePrototype
class ConcretePrototype extends Prototype {
    public ConcretePrototype() {
        // コストの高いインスタンス化処理
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void operation() {
        Date date = new Date();
        System.out.println(date);
    }
}

// Client
public class PrototypePattern {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype originalConcretePrototype = new ConcretePrototype();
        originalConcretePrototype.operation();

        Prototype clonedConcretePrototype = (Prototype)originalConcretePrototype.clone();
        clonedConcretePrototype.operation();  // インスタンス化処理が省略されるので、上の出力時刻と同じになる
    }
}

まとめ,所感

同じインスタンスを使いたいときに,冗長なインスタンス化処理を省略できるのは良い.

ただ,やはりSingletonパターンと同様に,実質的にグローバル変数と変わらない扱いになるのがあまりよろしくなさそう.