목록Design Pattern/Creational (6)
Exist Technote

Object Pool이란? 특정 객체의 생성 및 파괴가 잦을 경우 활용할 수 있는 패턴. 풀에 객체를 미리 생성해놓은 뒤 필요로 할 때 요청, 필요 없을 때 반환하는 패턴. 예제 컨텍스트 매니저 활용 import queue class QueueObjectPoolManager: # queue 객체를 받아 해당 queue 객체를 풀로써 활용한다. def __init__(self, queue, auto_get=False): self._queue = queue self.item = self._queue.get() if auto_get else None # with 문에 진입할 경우 진행하는 작업 def __enter__(self): if self.item is None: self.item = self._queu..

Builder Pattern이란? 복합 객체의 생성 과정과 표현 방법을 분리하여, 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴. 예제 만약 생성자를 사용하지 않는다면? # 복잡한 생성 과정과 def build(cls): building = cls() building.build_floor() building.build_size() return building # 객체의 표현 방법이 분리되었다. class Building: def __repr__(self): return "Floor: {0.floor} | Size: {0.size}".format(self) class House(Building): def build_floor(self): self.floor = "One" def bu..

Borg 패턴이란? monostate 패턴이라고도 불린다. 싱글톤이 특정 클래스가 단일 인스턴스를 반환한다면, borg 패턴은 생성하는 모든 인스턴스가 동일한 네임스페이스를 공유한다. 파이썬의 네임스페이스에 대한 개념은 Hyungcheol Noh's Blog에 잘 정리되어 있다. 예제 class Borg: _shared_state = {} def __init__(self): self.__dict__ = self._shared_state if __name__ == "__main__": borg1 = Borg() borg2 = Borg() print(borg1 is borg2) # 동일한 객체가 아니다. print(borg1.__dict__ is borg2.__dict__) # 네임스페이스를 공유한다..

Factory Method란? GOF에서 설명하는 Factory Method는 다음과 같다. 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 객체를 생성할 지에 대한 결정권을 서브클래스로 위임한다. 즉, 특정 인터페이스의 구체적인 구현이 여러 개 존재하는 다양한 상황에서 사용될 수 있는 패턴. 핵심 ObjectFactory로 생성된 인스턴스의 동작을 눈여겨보자. class ObjectFactory: def __init__(self): self._builders = {} def register_builder(self, key, builder): self._builders[key] = builder def create(self, key, *args, **kwargs): builder = self._bui..

Singleton이란? 하나의 클래스가 여러 차례 호출되더라도 최초 호출시에 생성된 객체만을 반환하는 클래스. 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 사용된다. 시작하기 전에 싱글톤이 안티패턴이냐 아니냐, 특정 싱글톤이 멀티쓰레드 환경에서 안전하냐 안전하지 않느냐 등의 토론을 한번 검색하여 찾아보길 추천한다. (...) 파이썬의 모듈을 싱글톤으로 활용할 수 있다고 한다. "클래스가 여러 차례 호출되더라도 최초 호출시에 생성된 객체만을 반환"에 집중하여 여러 예제들을 나열한다. 예제 생성자를 활용하여 구현된 싱글톤 class Singleton(object): # Singleton 클래스를 상속한 클래스가 자신의 단일 인스턴스를 보관한다..

참고 wikipedia faif/python-patterns 예제 코드를 직접 분석하고 나서 패턴을 이해하는 것이 옳은 순서라고 생각한다. 첫번째 예제 코드 import random class PetShop: def __init__(self, animal_factory=None): self.pet_factory = animal_factory def show_pet(self): pet = self.pet_factory() print("We have a lovely {}".format(pet)) print("It says {}".format(pet.speak())) class Dog: def speak(self): return "woof" def __str__(self): return "Dog" class ..