🐞

Builder

2023/09/10に公開

Builder パターンは、複雑なオブジェクトの構築プロセスをカプセル化し、同じ構築プロセスで異なる表現形式のオブジェクトを生成することを可能にするデザインパターンです。このパターンは、オブジェクトの生成とその表現を分離します。

主要な構成要素:

  1. Builder (ビルダー): 生成するオブジェクトの各部分を構築するためのインターフェースを定義します。
  2. ConcreteBuilder (具体的なビルダー): Builderのインターフェースを実装し、実際のオブジェクトの構築を行います。
  3. Director (ディレクター): Builderインターフェースを使用してオブジェクトを構築する手順を定義します。
  4. Product (製品): 生成されるオブジェクトです。

例:

想像してみてください。サンドイッチのビルダーがあり、異なる種類のサンドイッチを作成する必要がある場合。

  1. Builder:

    from abc import ABC, abstractmethod
    
    class SandwichBuilder(ABC):
        @abstractmethod
        def add_bread(self):
            pass
    
        @abstractmethod
        def add_fillings(self):
            pass
    
        @abstractmethod
        def add_sauce(self):
            pass
    
        def get_sandwich(self):
            return self.sandwich
    
    
  2. ConcreteBuilder:

    class VeggieSandwichBuilder(SandwichBuilder):
        def __init__(self):
            self.sandwich = Sandwich()
    
        def add_bread(self):
            self.sandwich.bread = "Whole grain bread"
    
        def add_fillings(self):
            self.sandwich.fillings = "Lettuce, Tomato, Cucumber"
    
        def add_sauce(self):
            self.sandwich.sauce = "Mustard"
    
    class ChickenSandwichBuilder(SandwichBuilder):
        def __init__(self):
            self.sandwich = Sandwich()
    
        def add_bread(self):
            self.sandwich.bread = "White bread"
    
        def add_fillings(self):
            self.sandwich.fillings = "Grilled chicken, Lettuce"
    
        def add_sauce(self):
            self.sandwich.sauce = "Mayonnaise"
    
    
  3. Director:

    class SandwichMaker:
        def __init__(self, builder):
            self.builder = builder
    
        def make_sandwich(self):
            self.builder.add_bread()
            self.builder.add_fillings()
            self.builder.add_sauce()
            return self.builder.get_sandwich()
    
    
  4. Product:

    class Sandwich:
        def __init__(self):
            self.bread = None
            self.fillings = None
            self.sauce = None
    
    

利点:

  1. 柔軟性: 複雑なオブジェクトをステップバイステップで構築する際の柔軟性を提供します。異なる種類や配置のサンドイッチを作ることが容易になります。
  2. クリーンなコード: 複雑なオブジェクトの作成プロセスがビルダークラス内にカプセル化されているため、クライアントコードはシンプルになります。
  3. 再利用: 同じビルダーオブジェクトを異なるディレクターで再利用できます。

Builder パターンは、オブジェクトの構築プロセスが複雑な場合や、オブジェクトに多くの構成要素が必要な場合に特に有用です。

Discussion