0
1

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が必要か?

❌ 毎回オブジェクトを初期化するコストが高い

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パターンはその再利用性を、設計とスピードの両立に昇華する技法である。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?