Python 간단 한 공장, 공장 방법, 추상 적 인 공장 설계 모델 실현

공장 모드
  • 개념
  • 실현
  • 단순 공장
  • 공장 방법
  • 공장 방법의 장점
  • 추상 공장
  • 공장 방법 과 추상 공장 의 비교
  • 콘 셉 트
    대상 을 대상 으로 공장 은 다른 유형의 대상 을 만 드 는 클래스 를 표시 합 니 다.공장 소유:
  • 소나무 결합
  • 클 라 이언 트 는 생 성 대상 의 종 류 를 알 필요 가 없 지만 이 를 사용 하여 대상 을 만 들 수 있 습 니 다.
  • 공장 에 다른 종 류 를 쉽게 추가 하여 다른 유형의 대상 을 만 들 수 있다.

  • 공장 모델 은 세 가지 변형 이 있다.
  • 간단 한 공장: 인터페이스 생 성 대상 을 허용 하지만 대상 의 생 성 논 리 를 드 러 내지 않 습 니 다.
  • 공장 방법: 인터페이스 생 성 대상 을 허용 하지만 어떤 종 류 를 사용 하여 대상 을 만 드 는 지 는 하위 클래스 에 맡 기 는 것 입 니 다.
  • 추상 공장: 추상 공장 은 일련의 관련 대상 을 만 들 수 있 고 구체 적 인 유형 을 지정 하지 않 아 도 되 는 인터페이스 이다.그것 은 다른 공장 의 대상 을 제공 하여 내부 에 다른 대상 을 만 들 수 있다.

  • 이루어지다
    단순 공장
  • 공장 은 들 어 오 는 매개 변수 에 따라 서로 다른 대상 을 되 돌려 주거 나 만 듭 니 다
  • # ABCMeta Python      ,       
    from abc import ABCMeta, abstractmethod
    
    
    #    ,  say  ,    
    class Animal(metaclass=ABCMeta):
        @abstractmethod
        def say(self):
            pass
    
    
    #   ,    ,  say  
    class Dog(Animal):
        def say(self):
            print('i am dog')
    
    
    #   ,    ,  say  
    class Cat(Animal):
        def say(self):
            print('i am cat')
    
    
    #    
    class ForestFactory(object):
        # say       ,      ,     say  
        def say_something(self, object_type):
            return eval(object_type)().say()
    
    
    if __name__ == '__main__':
        ff = ForestFactory()
        animal = 'Cat'
        ff.say_something(animal)
        '''  
        i am cat'''
    

    공장 방법
  • 인 터 페 이 스 를 정의 하여 대상 을 만 들 고 공장 자체 가 대상 을 만 들 지 않 으 며 하위 클래스 에 맡 기 고 하위 클래스 는 어떤 종 류 를 예화 할 지 결정 합 니 다.
  • Factory 방법의 생 성 시 계승 을 통 해 실례 화 되 지 않 습 니 다.
  • 공장 방법 은 더욱 맞 춤 형 으로 특정한 유형의 대상 이 아니 라 같은 사례 나 하위 클래스 로 돌아 갈 수 있다.

  • 각 페이지 에 개인 정 보 를 표시 하 는 구역 이 있다 고 가정 하지만 내용 이 다 르 면 디자인 코드 는 다음 과 같다.
    from abc import ABCMeta, abstractmethod
    
    #           ,   
    class Section(metaclass=ABCMeta):
        @abstractmethod
        def describe(self):
            pass
    
    
    #          ,           (       )
    #    
    class PersonalSection(Section):
        def describe(self):
            print('personal section')
    
    #     
    class AlbumSection(Section):
        def describe(self):
            print('album')
    
    #     
    class PatentSection(Section):
        def describe(self):
            print('patent')
    
    #     
    class PublicationSection(Section):
        def describe(self):
            print('publication')
    
    
    #         ,      create_profile
    class Profile(metaclass=ABCMeta):
        def __init__(self):
            self.sections = []
            self.create_profile()
    
        @abstractmethod
        def create_profile(self):
            pass
    
        def get_sections(self):
            return self.sections
    
        def add_sections(self, section):
            self.sections.append(section)
    
    #                   
    class ConcreteCreator1(Profile):
        def create_profile(self):
            #       、    、    
            self.add_sections(PersonalSection())
            self.add_sections(PatentSection())
            self.add_sections(PublicationSection())
    
    class ConcreteCreator2(Profile):
        def create_profile(self):
            #       、    
            self.add_sections(PersonalSection())
            self.add_sections(AlbumSection())
    
    if __name__ == '__main__':
        #    ConcreteCreator1    
        profile_type = 'ConcreteCreator1'
        profile = eval(profile_type)()
        print(type(profile).__name__)
        print(profile.get_sections())
        '''  
        ConcreteCreator1
        [<__main__.personalsection object="" at="">, <__main__.patentsection object="" at="">, <__main__.publicationsection object="" at="">]'''
    
    

    공장 방법의 장점
  • 더 좋 은 유연성, 코드 가 더욱 통용 된다. 왜냐하면 그 는 단순 한 사례 의 특정한 유형 이 아니 라 인터페이스
  • 에 달 려 있 기 때문이다.
  • 소나무 결합, 대상 을 만 드 는 코드 와 사용 하 는 코드 는 분리 되 어 있 으 며, 새로운 종 류 를 추가 하 는 것 이 더욱 쉽다.

  • 추상 공장
  • 추상 공장 의 주요 목적 은 일련의 관련 대상 을 만 들 기 위해 인 터 페 이 스 를 제공 하 는 것 이 고 구체 적 인 유형 을 지정 하지 않 아 도 된다.
  • 예전 의 수요 에 비해 우 리 는 어떤 대상 을 만 들 지 지정 하고 추상 적 인 공장 은 필요 없다.

  • 피자 가게 가 다양한 피 자 를 제공한다 고 가정 하면 추상 적 인 공장:
    '''    :
    1.                         ,         。
    2.                   ,       。'''
    from abc import ABCMeta, abstractmethod
    
    
    class PizzaFactory(metaclass=ABCMeta):
        #       
        @abstractmethod
        def create_veg_pizza(self):
            pass
    
        #       
        @abstractmethod
        def create_non_veg_pizza(self):
            pass
    
    
    class USAPizzaFactory(PizzaFactory):
        # USA               
        def create_veg_pizza(self):
            return CornPizza()
    
        # USA             
        def create_non_veg_pizza(self):
            return BeefPizza()
    
    
    class ChinaPizzaFactory(PizzaFactory):
        #                  
        def create_veg_pizza(self):
            return FruitsPizza()
    
        #                   
        def create_non_veg_pizza(self):
            return MuttonPizza()
    
    
    #      4         (       )
    class VegPizza(metaclass=ABCMeta):
        @abstractmethod
        def prepare(self, veg_pizza):
            pass
    
    
    #                     
    class NonVegPizza(metaclass=ABCMeta):
        @abstractmethod
        def serve(self, veg_pizza):
            pass
    
    
    class CornPizza(VegPizza):
        def prepare(self):
            print(type(self).__name__, '  ')
    
    
    class BeefPizza(NonVegPizza):
        def serve(self, veg_pizza):
            print(type(self).__name__, '  ,     ', type(veg_pizza).__name__,'   ')
    
    
    class FruitsPizza(VegPizza):
        def prepare(self):
            print(type(self).__name__, '  ')
    
    
    class MuttonPizza(NonVegPizza):
        def serve(self, veg_pizza):
            print(type(self).__name__, '  ,     ', type(veg_pizza).__name__,'   ')
    
    
    class PizzaStore(object):
        def __init__(self):
            pass
        
        def make_pizzas(self):
            #         (    ),         
            for factory in [USAPizzaFactory(), ChinaPizzaFactory()]:
                self.factory = factory
                self.non_veg_pizza = self.factory.create_non_veg_pizza()
                self.veg_pizza = self.factory.create_veg_pizza()
                #   
                self.veg_pizza.prepare()
                self.non_veg_pizza.serve(self.veg_pizza)
    
    
    pizza = PizzaStore()
    pizza.make_pizzas()
    

    공장 방법 과 추상 공장 의 비교
    공장 방법
    추상 공장
    대상 을 만 드 는 방법 을 엽 니 다.
    하나 이상 의 공장 방법 을 포함 하여 일련의 대상 을 만 듭 니 다.
    상속 과 하위 클래스 를 사용 하여 어떤 대상 을 만 들 지 결정 합 니 다.
    유 틸 리 티 조합 은 대상 을 만 드 는 작업 을 다른 클래스 에 맡 깁 니 다.
    제품 만 들 기
    관련 시리즈 (그룹) 제품 만 들 기

    좋은 웹페이지 즐겨찾기