파 이 썬 디자인 모델 - 공장 모델

설명 하 다.
공장 모델 은 소프트웨어 개발 에서 대상 을 만 드 는 디자인 모델 이다.
공장 모델 은 초 류 를 포함한다.이 초 류 는 어떤 대상 이 만 들 수 있 는 지 를 결정 하 는 것 이 아니 라 추상 화 된 인 터 페 이 스 를 제공 합 니 다.
이 방법 을 실현 하기 위해 서 는 공장 류 를 만 들 고 되 돌아 가 야 합 니 다.
프로그램 이 '형식' 을 입력 할 때 이 대상 을 만들어 야 합 니 다.이것 은 공장 모델 을 사용 했다.이러한 상황 에서 코드 는 공장 모델 을 바탕 으로 확장 가능 하고 유지 가능 한 코드 에 도달 할 수 있다.새로운 종 류 를 추가 하면 존재 하 는 종 류 를 수정 하지 않 고 새로운 종 류 를 만 들 수 있 는 하위 클래스 만 추가 합 니 다.
공장 방법
공장 방법 모델 에서 우 리 는 하나의 함 수 를 실행 하고 하나의 매개 변 수 를 전달 합 니 다 (정 보 를 제공 하여 우리 가 무엇 을 원 하 는 지 표시 합 니 다). 그러나 대상 이 어떻게 실현 되 고 대상 이 어디에서 왔 는 지 에 대한 세부 사항 을 요구 하지 않 습 니 다.
example: xml 및 json 파일 분석
class JSONConnector:
    def __init__(self, filepath):
    self.data = dict()
        with open(filepath, mode = 'r', encoding = 'utf-8') as f:
            self.data = json.load(f)
    @property
    def parsed_data(self):
        return self.data

class XMLConnector:
    def __init__(self, filepath):
    self.tree = etree.parse(filepath)
    @property
    def parsed_data(self):
        return self.tree

def connection_factory(filepath):
    if filepath.endswith('json'):
    connector = JSONConnector
    elif filepath.endswith('xml'):
        connector = XMLConnector
    else :
        raise ValueError('Cannot connect to {}'.format(filepath))
    return connector(filepath)
def connect_to(filepath):
    factory = None
    try:
        factory = connection_factory(filepath)
    except ValueError as ve:
        print(ve)
    return factory
def main():
    sqlite_factory = connect_to('data/person.sq3')
    print()
    xml_factory = connect_to('data/person.xml')
    xml_data = xml_factory.parsed_data
    liars = xml_data.findall(".//{}[{}='{}']".format('person',
        'lastName', 'Liar'))
    print('found: {} persons'.format(len(liars)))
    for liar in liars:
        print('first name: {}'.format(liar.find('firstName').text))
    print('last name: {}'.format(liar.find('lastName').text))
    [print('phone number ({})'.format(p.attrib['type']),p.text) for p in liar.find('phoneNumbers')]
    print()
    json_factory = connect_to('data/donut.json')
    json_data = json_factory.parsed_data
    print('found: {} donuts'.format(len(json_data)))
    for donut in json_data:
        print('name: {}'.format(donut['name']))
        print('price: ${}'.format(donut['ppu']))
        [print('topping: {} {}'.format(t['id'], t['type'])) for t in donut['topping']]

추상 공장
추상 적 인 공장 설계 모델 은 추상 적 인 방법의 일반화 이다.요약 하면 하나의 추상 적 인 공장 은 (논리 적) 공장 방법 으로 그 중의 모든 공장 방법 은 서로 다른 종류의 대상 을 만들어 내 는 것 을 책임 진다.
example:
class Frog:

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

    def interact_with(self, obstacle):
        print('{} the Frog encounters {} and {}!'.format(self,
                                                         obstacle, obstacle.action()))


class Bug:

    def __str__(self):
        return 'a bug'

    def action(self):
        return 'eats it'


class FrogWorld:

    def __init__(self, name):
        print(self)
        self.player_name = name

    def __str__(self):
        return '

\t------ Frog World ———'
def make_character(self): return Frog(self.player_name) def make_obstacle(self): return Bug() class Wizard: def __init__(self, name): self.name = name def __str__(self): return self.name def interact_with(self, obstacle): print('{} the Wizard battles against {} and {}!'.format(self, obstacle, obstacle.action())) class Ork: def __str__(self): return 'an evil ork' def action(self): return 'kills it' class WizardWorld: def __init__(self, name): print(self) self.player_name = name def __str__(self): return '

\t------ Wizard World ———'
def make_character(self): return Wizard(self.player_name) def make_obstacle(self): return Ork() class GameEnvironment: def __init__(self, factory): self.hero = factory.make_character() self.obstacle = factory.make_obstacle() def play(self): self.hero.interact_with(self.obstacle) def validate_age(name): try: age = input('Welcome {}. How old are you? '.format(name)) age = int(age) except ValueError as err: print("Age {} is invalid, please try \ again…".format(age)) return (False, age) return (True, age) def main(): name = input("Hello. What's your name? ") valid_input = False while not valid_input: valid_input, age = validate_age(name) game = FrogWorld if age < 18 else WizardWorld environment = GameEnvironment(game(name)) environment.play() if __name__ == '__main__': main()

응용 장면
두 가지 모델 은 모두 다음 과 같은 몇 가지 장면 에 사용 할 수 있다.
(a) 대상 의 생 성 을 추적 하려 는 경우
(b) 대상 의 생 성과 결합 을 사용 하려 고 할 때
(c) 응용 성능 과 자원 점용 을 최적화 하려 면.
공장 방법 설계 모델 의 실현 은 그 어떠한 종류의 단일 함수 에 도 속 하지 않 고 단일 한 종류의 대상 (하나의 모양, 하나의 연결 점 또는 다른 대상) 의 생 성 을 책임 진다.추상 적 인 공장 디자인 모델 의 실현 은 같은 하나의 유형 에 속 하 는 여러 공장 방법 으로 일련의 관련 대상 (한 대의 차 부품, 한 게임 의 환경 또는 다른 대상) 을 만 드 는 데 사용 된다.
예 출처: Python 디자인 모델 에 정통

좋은 웹페이지 즐겨찾기