概要
Prototype(プロトタイプ)パターンは、
インスタンスの作成コストが高い・初期化が複雑なオブジェクトを、複製(クローン)によって再生成する設計パターンである。
工場のように新しいインスタンスを生成するのではなく、“元になるオブジェクト”を複製して使い回すことに重点がある。
1. なぜPrototypeが必要か?
❌ 毎回オブジェクトを初期化するコストが高い
obj = ExpensiveObject(config, state, dependencies)
→ 生成のたびに大量の初期設定や依存解決が必要
✅ 元となるオブジェクトを複製して新しいインスタンスを得る
clone = prototype.clone()
→ 設定済みのオブジェクトを複製することで、コスト削減・初期状態の維持が可能に
2. 基本構造
✅ Prototypeインターフェース
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
✅ 複製される具体クラス
class Document(Prototype):
def __init__(self, title, content):
self.title = title
self.content = content
def display(self):
print(f"[{self.title}] {self.content}")
✅ 使用例
original = Document("設計書", "初期状態のコンテンツ")
original.display()
copy1 = original.clone()
copy1.title = "設計書コピー1"
copy1.display()
copy2 = original.clone()
copy2.title = "設計書コピー2"
copy2.content = "別のコンテンツ"
copy2.display()
出力:
[設計書] 初期状態のコンテンツ
[設計書コピー1] 初期状態のコンテンツ
[設計書コピー2] 別のコンテンツ
3. Python的応用:辞書やリスト構造でもPrototype的に使える
import copy
template = {
"type": "user",
"settings": {
"theme": "dark",
"notifications": True
}
}
user1 = copy.deepcopy(template)
user1["settings"]["theme"] = "light"
user2 = copy.deepcopy(template)
user2["settings"]["notifications"] = False
→ 構造のテンプレートをそのままPrototypeとして活用可能
4. 実務ユースケース
✅ フォーム・UIコンポーネントの初期状態テンプレート化
→ 同一設定のフォームを複製して利用可能に
✅ ゲームキャラクターやアイテムの雛形からの生成
→ ステータス・見た目・装備を保持した状態でのクローン
✅ モデル・設定済みオブジェクトのベースインスタンス
→ 学習済みAIや事前設定済みモデルの複製
✅ 書類・帳票・申請書テンプレートの複製
→ 「原本」からの生成が必要なビジネス領域において有効
5. よくある誤用と対策
❌ 浅いコピーで内部構造が共有されてしまう
→ ✅ copy.deepcopy()
を使用し、完全な独立複製を保証する
❌ 複製元に依存しすぎて動的変更に対応できない
→ ✅ クローン後の状態変更が許容されるように設計する
❌ 初期化と複製の責務が混在する
→ ✅ __init__
と clone()
の役割を明確に分離
結語
Prototypeパターンとは、“構築済みの知性を複製し、再利用可能な初期状態を創出する設計”である。
- オブジェクトの初期化コストや設定の手間を削減し、複製による生成を効率化
- 複雑な構造や状態を維持したまま再利用でき、一貫したテンプレート設計が可能
- Pythonでは
copy
モジュールと柔軟なデータ構造により、極めて簡単に実装可能
Pythonicとは、“使いまわせるものは、賢くコピーすること”。
Prototypeパターンはその再利用性を、設計とスピードの両立に昇華する技法である。