싱글턴(Borg) 패턴: 여러개의 오브젝트가 하나의 상태를 공유합니다.
In [ ]:
class Person(object):
__shared_state = {} # 모든 인스턴스의 속성은 클래스 변수에서 공유됩니다.
def __init__(self, name):
self.__dict__ = self.__shared_state
self.name = name
In [ ]:
tom = Person('tom')
In [ ]:
jane = Person('jane')
In [ ]:
tom is jane
In [ ]:
tom.name
In [ ]:
jane.name
In [ ]:
class Person2(object):
__instance = None
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = super(Person2, cls).__new__(cls)
return cls.__instance
def __init__(self, name):
self.name = name
In [ ]:
tom = Person2('tom')
jane = Person2('jane')
In [ ]:
tom is jane
In [ ]:
tom.name
In [ ]:
jane.name
스트래티지 패턴: 메소드를 주입하여 기능을 조절합니다.
In [ ]:
def lower(str):
print(str.lower())
In [ ]:
def upper(str):
print(str.upper())
In [ ]:
class Person3(object):
def __init__(self, func=None):
if func is not None:
self.exe = func
def exe(self, name):
print(name)
In [ ]:
lower_person = Person3(lower)
In [ ]:
lower_person.exe('Jane')
In [ ]:
upper_person = Person3(upper)
In [ ]:
upper_person.exe('Jane')
어댑터 패턴: 클래스의 메소드를 바꾸어 인터페이스를 단일화합니다.
In [ ]:
class Human(object):
def speak(self):
print('hello')
In [ ]:
class Dog(object):
def bark(self):
print('walwal')
In [ ]:
class Adapter(object):
def __init__(self, obj, **kwargs):
self.obj = obj
self.__dict__.update(kwargs)
def __getattr__(self, attr):
return getattr(self.obj, attr)
In [ ]:
human = Human()
human.speak()
In [ ]:
dog = Dog()
dog.bark()
In [ ]:
dog = Adapter(dog, make_sound=dog.bark)
In [ ]:
dog.make_sound()
In [ ]:
human = Adapter(human, make_sound=human.speak)
In [ ]:
human.make_sound()