0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで実装するPrototypeパターン:オブジェクトの複製による効率的生成

Posted at

概要

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パターンはその創造的複製を、合理的かつ構造的に表現する技法である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?