초보python 엔지니어 총괄 디자인 모델 총괄 4(prototype)

종지


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

제품 모델 개요


생성된 디자인 모델 중의 하나.
"생성할 대상의 종류를 원형으로 하는 실례를 만들고 이 실례를 복사하여 대상 대상을 생성한다"
실례의 생성에 비용(시간적 또는 자원적)이 드는 경우, 또는 클래스로 규정할 필요가 없거나(또는 모든 종류를 클래스로 설치하는 것은 비현실적), 여러 실례에 대해 개별적인 속성 값을 부여하고 서로 다른 동작을 설치하는 방법을 사용하는 경우.
사용 빈도가 높지 않은 것 같아요.

클래스 및 시퀀스




wikipedia 참조

실시 방침

  • Prototype 클래스는 실례를 복제하는 기본 방법(clone)(template method 모드)을 규정합니다. ※실례를 이용한 규정 방법(use)이 필요하다면 규정한다
  • Prototype 하위 클래스(ConcretePrototype 클래스)는 실제 복제 실례에 대한 책임이 있습니다.클론 덮어쓰기 방법.self를 deepcopy 대상으로 되돌리는 방법입니다
  • 관리 대상이 생성한 관리자 클래스가 있으면 매우 편리하다.관리자 클래스는 복사 원본의 실례를 유지하고 복사와 지정한 실례를 설치하는 방법입니다
  • 클라이언트에 호출 관리자를 설치하는 IF 처리
  • 구현 예1
    # prototype側
    class Prototype:
      @abstractmethod
      def use(self):
        pass
      @abstractmethod
      def create(self)
        pass
    
    class ConcretePrototype1(Prototype):
      def use(self):
        do_something1()
    
      def create(self)
        clone = copy.deepcopy(self) # deep copyとshallow copyに注意
        clone.set_parameter1(some_args)
        return clone
    
    class ConcretePrototype2(Prototype):
      def use(self):
        do_something2()
    
      def create(self, some_args)
        clone = copy.deepcopy(self)
        clone.set_parameter2(some_args)
        return clone
    
    # Manager側(例)
    class CreatingPrototypeManager:
       def __init__(self):
            self.__ins_dict = {}
       def register_ins(self, prot_ins_key: str, prot_ins: Prototype):
           self.__ins_dict[prot_ins_key]
       def create_ins(self, prot_ins_keye, some_args: obj) 
           ins = self.__ins_dict[prot_ins_key]
           ins.set_params(some_args)
           return ins
    # client側
    def main():
     prot1 = ConcretePrototype1()
     prot2 = ConcretePrototype2()
     prot_mgr = CreatingPrototypeManager()
     prot_mgr.register_ins("prot1", prot1)
     prot_mgr.register_ins("prot2", prot2)
     # register_insまでの処理はManagerに持たせても良い) 
    
     ins1 = prot_mgr.create_ins("prot1", params1)
     ins1 = prot_mgr.create_ins("prot1", params2)
     ins1 = prot_mgr.create_ins("prot1", params3)
     ins2 = prot_mgr.create_ins("prot1", params4)
    
    

    용도

  • 사용처
  • 실례를 생성하는 데 비용(시간 또는 자원)이 들고 여러 개의 실례를 생성한다
  • 클래스(또는 모든 종류를 클래스로 설치하는 것은 비현실적)로 규정할 필요가 없다. 여러 실례에 대해 개별적인 속성 값을 부여하고 서로 다른 동작의 방법을 설치하고 싶은 경우
  • 좋은 웹페이지 즐겨찾기