prototypeは日本語で「試作品」,「原型」という意味になる.Prototypeパターンは,新しいオブジェクトを作成する際に,既存のオブジェクト(インスタンス)を使用して複製するパターンである.
オブジェクトのインスタンス化のコストが高い場合や,システム内で多数の同じオブジェクトが必要な場合に有効である.
Prototypeパターンの主な要素は以下である.
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パターンと同様に,実質的にグローバル変数と変わらない扱いになるのがあまりよろしくなさそう.