Design Patterns

-
공개
2017.10.31 00:47:23
조회수 31.9k 등록일 2018.10.09 18:02:36

디자인 패턴 중 보그(borg) 패턴에 대해 알아보자.


기본개념

보그 패턴은 monostate pattern이라고도 불린다. 싱글턴 패턴과 매우 유사하지만 싱글턴 패턴은 하나의 인스턴스만 갖는 대신에

보그 패턴은 여러개의 인스턴스에서 하나의 상태(state)를 공유한다는게 차이점이다. 즉, 하나의 인스턴스를 공유하는게 아니고 하나의 상태(state)를 공유하는 것이다. 


구현

구현은 파이썬 언어로 작성되었다.

  1. class Borg:
  2. _shared_state = {}
  3.  
  4. def __init__(self):
  5. self.__dict__ = self._shared_state
  6.  
  7.  
  8. a = Borg()
  9. b = Borg()
  10.  
  11. print(a is b) # False
  12. a.site = 'dolgonet'
  13. print(b.site) # dolgonet

일반적으로 파이썬의 인스턴스에는 __dict__이라는 속성이 있고,  모든 인스턴스에는 자신만의 __dict__을 가지고 있다.

코드에서는 의도적으로 __dict__에 클래스 변수인 _shared_state를 할당하고, 이렇게 함으로써 모든 인스턴스는 하나의 상태(state)를 공유하게 되는 것이다.


참고자료

- Python Design Pattern

조회수 31.4k 등록일 2018.10.07 17:24:30

디자인 패턴중에서 싱글턴(Singleton) 패턴에 대해서 알아보자.


기본 개념

싱글턴 패턴은 오래전부터  많이 알려지고 사용된 디자인 패턴중에 하나로

하나의 클래스에 인스턴스를 하나만 만들어야하는 경우 사용되는 패턴이다.

최초 생성 이후에 호출되는 생성자는 최초 인스턴스를 리턴한다.


싱글턴은 다음과 같은 상황에 사용된다.

  1. 공유자원(shared resource)에 대한 동시접근(concorrenct access)을 제어할 필요가 있는 경우.
  2. 여러 시스템에서 하나의 자원에 접근하는 지점이 필요한 경우.
  3. 유일객체(unique object)가 필요한 경우.


일반적으로 싱글턴이 사용되는 예는 다음과 같다.

  1. logging class.
  2. print spooler.
  3. DBCP(Dabasebase Connection Pool).
  4. File Manager.
  5. 전역 상태를 담고 있는 읽기 전용 싱글턴.


구현

구현은 파이썬 언어로 작성하였다. 

  1. class Singleton:
  2. def __new__(cls, *args, **kwargs):
  3. if not hasattr(cls, 'instance'):
  4. cls.instance = super(Singleton, cls).__new__(cls)
  5. return cls.instance
  6.  
  7. a = Singleton()
  8. b = Singleton()
  9. print(a) #<__main__.Singleton object at 0x10d4d5278>
  10. print(b) #<__main__.Singleton object at 0x10d4d5278>

같은 객체임을 알 수 있다. 


아래는 위키피디아에서 작성되어 있는 예제 코드이다.

  1. class Singleton(type):
  2. def __init__(cls, name, bases, dict):
  3. super(Singleton, cls).__init__(name, bases, dict)
  4. cls.instance = None
  5.  
  6. def __call__(cls, *args, **kw):
  7. if cls.instance is None:
  8. cls.instance = super(Singleton, cls).__call__(*args, **kw)
  9. return cls.instance
  10.  
  11. class MyClass(object):
  12. __metaclass__ = Singleton
  13.  
  14. print MyClass()
  15. print MyClass()


Descorator 사용

  1. def singleton(cls):
  2. instance = []
  3. def getinstance():
  4. if not len(instance):
  5. instance.append(cls())
  6. return instance[0]
  7. return getinstance
  8.  
  9. @singleton
  10. class MyClass:
  11. ...


참고 자료

- Python Design Patterns

- wikipedia