초보 엔지니어 총결산 디자인 모델 총결산3

종지


초보 엔지니어 비망록의 현수막.
※ 출처가 누락된 경우
출처:
https://yamakatsusan.web.fc2.com/
https://dackdive.hateblo.jp/
https://www.oreilly.co.jp/books/9784873117393/

builder 모드 개요


복합 대상에 대해 제작 과정이 표현 형식에 의존하지 않도록 함으로써 같은 제작 과정에서 서로 다른 표현 형식의 대상을 생성할 수 있다.
'구축기'는 점차적으로 복합 대상을 만드는 과정에 중점을 둔다.Abstract Factory는 부품의 집합을 강조합니다(간단하든 복잡하든).
  • 복잡한 부품 생성 처리를 하는 상황에서 지시로 생성된director를 설정하여client와 생성자(builder) 사이에 필요한 복잡한 처리를 흡수한다.director의 메인 프로그램에서 생성 절차를 기술하기 때문에builder는 단계적으로 위젯을 만들 수도 있고 여러 위젯을 만들 수도 있습니다
  • 단계적인 단계의 부품 제작이 필요하고 부품의 제작 절차가 빈번하게 변경될 가능성이 있는 상황에서 사용한다
  • 클래스 및 시퀀스




    wikipedia 참조

    실시 방침

  • AbstractBuilder 클래스에서template method처럼 대상의 실례 제작 절차(필수 방법)를 규정합니다
  • Builder 하위 클래스에서 필수 메서드를 덮어씁니다
  • Director 클래스에서 생성 처리(construct)로서builder의 필요한 방법을 호출하면서 대상 생성 절차를 기술합니다
  • 클라이언트 측에서 디렉터 클래스만 호출하고director만 호출하는construct를 통해 대상을 생성하는 처리를 기술합니다
  • 구현 예1
    # builder側
    class AbstractBuilder:
     @abstractmethod
     def build_part1(self):
       pass
     @abstractmethod
     def build_part2(self):
       pass
     @abstractmethod
     def build_part3(self):
       pass
    
    class ConcreteBuilder(AbstractBuilder):
     def build_part1(self):
       # 実処理を記載
       self.do_something() # 処理を実装
     def build_part2(self):
       # 実処理を記載
       self.do_something2() # 処理を実装
     def build_part3(self): 
       return self.get_product() # 処理を実装
    
    # director側
    class MyDirector: # 注目すべきは考え方なので、内部の実装は作成するものによる(あくまで一例)
    
       def construct(self):
         #生成手順を実装
        self.builder.build_part1()
        self.builder.build_part2()
        return self. builder.build_part3()
    
       @classmethod
       def create_director(cls, some_args: obj):
         builder_cls = get_builder_cls(some_args) # 処理を実装
         return cls(builder_cls())
    
    # client側
    def main():
     director =  MyDirector.create_director("some_args_for_deciding_builder_cls")
     product = director.construct() 
    
    구현 사례 2_Director 모드 전환 예
    # director側
    class AbstractDirector:
      @abstractmethod
      def construct(self):
        pass
    
      @abstractmethod
      def create_director(self):
        raise NotImplementedError()
    
      @classmethod
      def get_director_cls(cls, some_args: obj):
         director_cls = get_director_cls(some_args) # 処理を実装
         return director_cls
    
    class MyDirector(AbstractDirector): 
    
       def construct():
         #生成手順を実装
        self.builder.build_part1()
        self.builder.build_part2()
        return self. builder.build_part3()
    
       @classmethod
       def create_director(cls,some_args: obj):
         builder_cls = get_builder_cls(some_args) # 処理を実装
         return cls(builder_cls())
    
    class YourDirector(AbstractDirector): 
    
       def construct():
         #生成手順を実装
        self.builder.build_ex_part1()
        self.builder.build_ex_part2()
        return self.builder.build_ex_part3()
    
       @classmethod
       def create_director(cls,some_args: obj):
         builder_cls = get_builder_cls(some_args) # 処理を実装
         return cls(builder_cls())
    
    # client側
    def main():
     director_cls =  AbstractDirector.get_director_cls("some_args_1")
     director =  director_cls.create_director("some_args_2")
     product = director.construct() 
    

    이점 및 용도

  • 장점
  • 실례 생성 논리는client 코드(Director의 인터페이스에 의존하지 않음)에 의존하지 않는다
  • 복잡한 생성 처리는 Director에 의존할 수 있다.또한 용법 2처럼 Director 하위 클래스에서
    클라이언트에 의존하지 않고 서로 다른 순서로 같은 대상을 만들 수도 있다
  • 사용처
  • 많은 구성 요소로 구성된 대상을 생성하는 알고리즘은 구성 요소 자체와 그들이 어떻게 조합되었는지에서 독립된 상황을 만들어야 한다
  • 대상의 제작 과정은 반드시 대상에 대한 각종 표현의 상황을 인정해야 한다
  • 단계적인 단계의 부품 제작이 필요하고 부품의 제작 절차가 빈번하게 변경될 가능성이 있는 상황에서 사용한다
  • 좋은 웹페이지 즐겨찾기