概要
Prototype(プロトタイプ)パターンは、
クラスからではなく既存のオブジェクトから複製(コピー)して新しいインスタンスを生成することを目的としたデザインパターンである。
大量生成や設定が複雑なオブジェクトを扱う際に、一からインスタンス化せずに、既存のひな形をコピーすることで効率的に生成できる。
1. なぜPrototypeが必要か?
❌ 毎回インスタンスを新規構築
hero = Character(name="Archer", level=1, skills=["bow", "hide"])
→ 毎回同じ属性を初期化するのは非効率。
設定もれや記述の重複が保守性とパフォーマンスに悪影響
✅ プロトタイプからクローンを生成して簡略化
new_hero = archer_prototype.clone()
→ 構造も状態もコピーされ、再構成の手間が不要に
2. 基本構造
✅ Prototype(インターフェース)
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
✅ ConcretePrototype(複製可能な具体クラス)
class Character(Prototype):
def __init__(self, name, level, skills):
self.name = name
self.level = level
self.skills = skills
def __str__(self):
return f"{self.name} (Lv:{self.level}) Skills: {', '.join(self.skills)}"
✅ 使用例
archer = Character("Archer", 1, ["bow", "hide"])
mage = Character("Mage", 1, ["fire", "teleport"])
archer_clone = archer.clone()
mage_clone = mage.clone()
print(archer_clone) # Archer (Lv:1) Skills: bow, hide
print(mage_clone) # Mage (Lv:1) Skills: fire, teleport
→ 全ての構造がディープコピーされ、独立したインスタンスとして動作
3. Python的応用:Prototype Factory
class PrototypeFactory:
def __init__(self):
self._registry = {}
def register(self, key, prototype):
self._registry[key] = prototype
def create(self, key):
return self._registry[key].clone()
factory = PrototypeFactory()
factory.register("warrior", Character("Warrior", 1, ["sword"]))
factory.register("healer", Character("Healer", 1, ["heal", "barrier"]))
unit1 = factory.create("warrior")
unit2 = factory.create("healer")
print(unit1)
print(unit2)
→ プロトタイプの定義と複製の呼び出しを疎結合に設計可能
4. 実務ユースケース
✅ ゲームにおけるユニットテンプレート生成
→ パラメータの共通化と複製による高速生成
✅ フロントエンドUIコンポーネントのクローン生成(例:ツールチップ、ボタン)
→ 同一スタイル・構造の複製による効率的UI再利用
✅ 初期状態が複雑なデータ構造のテンプレート化
→ オブジェクト生成処理を1回に集約し、後はクローンで分配
✅ ドキュメント・設定ファイルのインスタンス管理
→ プリセットとしての元データからカスタム版を複製
5. よくある誤用と対策
❌ copy.copy()
と copy.deepcopy()
の違いを無視
→ ✅ 参照を共有すべきでない場合は deepcopy を明示的に使用
❌ 複製元がミュータブルな状態を持つ設計
→ ✅ プロトタイプはできるだけイミュータブル設計に近づけ、予期しない変更を防止
❌ コンストラクタで副作用を起こしている
→ ✅ 副作用のある処理は clone 後に明示的に再実行する構造に
結語
Prototypeパターンとは、“既存の知性をコピーし、反復可能な創造性を与える”構造設計である。
- 状態を持ったひな形を複製することで、構築の高速化と設計の統一が可能に
- コンストラクションコストや記述冗長性を抑制し、テンプレートベースのオブジェクト生成を柔軟に構成
- Pythonでは
copy.deepcopy
や__dict__
操作により、非常にシンプルかつ強力なPrototype実装が実現可能
Pythonicとは、“再利用性と効率性を設計段階から取り入れる”こと。
Prototypeパターンはその創造的複製を、合理的かつ構造的に表現する技法である。