Python/Design Patterns

보그(Borg)

코닝구 2020. 9. 27. 19:00

디자인 패턴 중에서 보그(Borg) 패턴에 대해 알아보자. 보그는 단일 상태(monostate) 라고도 불리운다. 단일 동작을 위한 싱글톤(Singleton) 패턴과 매우 유사하지만 차이점은 상태(state)를 공유한다는 점이다. 즉, 여러개의 인스턴스는 하나의 상태(state)를 공유한다.

싱글턴을 사용한다면 서브클래싱(subclassing)에서는 보그 패턴이 더 나은 대안이 될 수 있다. 두 개 이상의 서브클래스가 하나의 슈퍼클래스를 상속한 경우 서브클래스별로 동작(behavior)을 다르게 재 정의하지만 상태는 여전히 공유되기 때문이다.


class Borg:
    _shared_sate = {}

    def __init__(self):
        self.__dict__ = self._shared_sate


if __name__ == '__main__':
    b1 = Borg()
    b2 = Borg()

    b1.name = 'coninggu'

    print(b1 is b2)  # False
    print(b1.name)  # coninggu
    print(b2.name)  # coninggu

파이썬의 인스턴스에는 __dict__ 속성이 있다. 그리고 __dict__은 인스턴스마다 고유하다. 구현 코드에서는 상태를 공유하기 위해 초기화 메소드(__init__)에서 __dict__ 속성에 클래스 변수인 _shared_state를 참조하도록 하였다. dict은 참조(reference) 형태로 전달되는 변경 가능한 뮤터블(mutable) 객체임으로 b1 인스턴스에서 dict을 변경하면 모든 인스턴스에도 변경된다.

참고로 ActiveState라는 커뮤니티에서 싱글턴(singleton)과 보그(borg) 패턴에 대한 논의가 되었다. 그리고 그 논의에서 단일 인스턴스를 가진다는 이유로 보그 패턴에서 해결하지 못한 메모리 문제를 싱글턴 패턴에선 해결하였다고 한다.

'Python > Design Patterns' 카테고리의 다른 글

템플릿 메소드(Template Method)  (0) 2020.09.30
싱글턴(Singleton)  (0) 2020.09.29
퍼사드(Facade)  (0) 2020.09.27
데코레이터(Decorator)  (0) 2020.09.22