싱글턴(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()