23パターンのデザインパターンがGoFではある
生成に関するパターン
・シングルトン
参考サイトhttps://cs-techblog.com/technical/design-patterns/
Singleton(シングルトン)パターン
シングルトンパターンは特定のクラスに対して唯一のインスタンスを確保し、そのインスタンスにアクセスするためのグローバルなアクセスポイントを提供するデザインパターンです。このパターンは主に以下の目的で使用されます:
- 唯一性の保証: Singletonは、複数のインスタンスが生成されることを防ぎ、常に同じインスタンスを返します。これにより、リソースの無駄遣いや状態の不整合を避けることができます。
- グローバルなアクセスポイント: Singletonを使用することで、アプリケーションのどの部分からでもインスタンスにアクセスできるため、システム全体で状態を共有しやすくなります。
- 遅延初期化: 通常、Singletonは初めて要求されたときにインスタンスを生成するため、リソースの効率的な利用が可能です。
実装例(Python)
class Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls)
# 初期化処理
return cls._instance
# 使用例
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # Trueが出力される
用途
- ログ管理、設定管理、データベース接続等、アプリケーションで一貫した状態を維持する必要があるシナリオでよく使用されます。
このパターンは有用ですが、適切に実装しないと、テストが難しくなったり、マルチスレッド環境での競合状態を引き起こす可能性があるため、注意が必要です。
Prototype(プロトタイプ)パターン
プロトタイプパターンとは既存のオブジェクトをコピーすることで新しいオブジェクトを生成し、直接インスタンス化する代わりにクローンを利用するデザインパターンです。このパターンの主な利点や特徴は以下の通りです。
特徴・利点
- インスタンス生成の簡素化: プロトタイプパターンを使用することで、複雑なコンストラクタや初期化ロジックを簡略化できます。特にオブジェクトの生成に一定の時間やリソースがかかる場合に有効です。
- 柔軟性: 新しいオブジェクトの生成が既存のオブジェクトに基づくため、様々なバリエーションのオブジェクトを容易に作ることができます。これにより、オブジェクトの構造や状態を簡単に変更できます。
- 構造の隠蔽: クライアント側は具体的なクラスではなくプロトタイプを扱うため、実際のオブジェクトの構造を知らなくても使用できます。
実装例(Python)
import copy
class Prototype:
def clone(self):
return copy.deepcopy(self)
class ConcretePrototype(Prototype):
def __init__(self, attribute):
self.attribute = attribute
# 使用例
prototype1 = ConcretePrototype("Original")
prototype2 = prototype1.clone() # クローン作成
print(prototype1.attribute) # Original
print(prototype2.attribute) # Original
用途
- 複雑なオブジェクトの生成や、ライブラリ/フレームワークでのオブジェクト管理に適しています。また、ゲーム開発などで、異なる状態を持つ大量のオブジェクトを生成する必要がある場合にも有用です。
Factory Method(ファクトリーメソッド)パターン
Factory Method(ファクトリーメソッド)パターンは、インスタンス生成の詳細をサブクラスに委譲することで、クライアントが具体的なクラスを意識せずにオブジェクトを生成できるデザインパターンです。このパターンの核心的な機能は、オブジェクトの生成をカプセル化することによって、コードの柔軟性と拡張性を向上させる点にあります。
特徴・利点
- クラスの柔軟性: Factory Methodパターンを使用すると、クライアントが依存する具体的なクラスを知る必要がなくなります。これにより、実装を変更する際にクライアントコードを修正する必要がなくなります。
- 拡張の容易さ: 新しいサブクラスを追加しても、Factory Methodを実装することで簡単に新しいオブジェクトを生成できるため、システムの拡張が容易です。これにより、オープン・クローズド原則にも則ります。
- 一貫したインターフェース: 同じインターフェースを通じて異なるオブジェクトを生成できるため、クライアントはシンプルなインターフェースを介して異なる種類のオブジェクトにアクセスできます。
実装例(Python)
from abc import ABC, abstractmethod
class Product(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteProductA(Product):
def operation(self):
return "Result of ConcreteProductA"
class ConcreteProductB(Product):
def operation(self):
return "Result of ConcreteProductB"
class Creator(ABC):
@abstractmethod
def factory_method(self) -> Product:
pass
def some_operation(self) -> str:
product = self.factory_method()
return product.operation()
class ConcreteCreatorA(Creator):
def factory_method(self) -> Product:
return ConcreteProductA()
class ConcreteCreatorB(Creator):
def factory_method(self) -> Product:
return ConcreteProductB()
# 使用例
creator_a = ConcreteCreatorA()
print(creator_a.some_operation()) # "Result of ConcreteProductA"
creator_b = ConcreteCreatorB()
print(creator_b.some_operation()) # "Result of ConcreteProductB"
用途
- プラットフォームやフレームワークの開発、APIの設計、さらには異なる種類の製品を生成する際に特に有用です。また、再利用しやすいコードを構築しやすくします。
ストラクチュアクラス
アダプター