[파이썬] 생성 패턴과 객체 생성 처리

Python은 객체 지향 프로그래밍 언어로, 객체 생성은 프로그램의 기능과 동작에 중요한 역할을 합니다. 생성 패턴은 객체 생성을 효율적으로 처리하기 위한 디자인 패턴입니다. 이번 글에서는 Python에서 생성 패턴과 객체 생성 처리에 대해 다뤄보겠습니다.

1. Singleton 패턴

Singleton 패턴은 오직 하나의 인스턴스만을 만들고 이를 전역적으로 사용하는 패턴입니다. 이는 보통 공유 자원에 대한 접근을 제어하고, 객체 생성 비용을 줄이기 위해 사용됩니다.

아래는 Python에서 Singleton 패턴을 구현하는 예시입니다:

class Singleton:
    _instance = None

    @staticmethod
    def get_instance():
        if not Singleton._instance:
            Singleton._instance = Singleton()
        return Singleton._instance

위의 예시에서는 _instance라는 클래스 변수를 사용하여 단일 인스턴스를 저장하고, get_instance() 메서드를 통해 인스턴스를 반환합니다. 이렇게 함으로써 어디서나 동일한 인스턴스에 접근할 수 있게 됩니다.

2. Factory 패턴

Factory 패턴은 객체 생성을 캡슐화하여 클라이언트 코드로부터 객체 생성 로직을 분리하는 패턴입니다. 이를 통해 클라이언트는 객체를 생성하기 위해 직접적인 클래스 인스턴스화를 하지 않고도 원하는 객체를 얻을 수 있습니다.

아래는 Python에서 Factory 패턴을 구현하는 예시입니다:

class Vehicle:
    def move(self):
        pass

class Car(Vehicle):
    def move(self):
        return "Car is moving"

class Bike(Vehicle):
    def move(self):
        return "Bike is moving"

class VehicleFactory:
    def create_vehicle(self, vehicle_type):
        if vehicle_type == "car":
            return Car()
        elif vehicle_type == "bike":
            return Bike()

factory = VehicleFactory()
car = factory.create_vehicle("car")
bike = factory.create_vehicle("bike")

print(car.move()) # "Car is moving"
print(bike.move()) # "Bike is moving"

위의 예시에서 Vehicle 클래스는 추상화된 베이스 클래스이며, CarBike 클래스는 이를 상속받아 적절한 move() 메서드를 오버라이딩합니다. VehicleFactory 클래스에서는 클라이언트에서 원하는 타입의 객체를 생성하여 반환합니다.

3. Builder 패턴

Builder 패턴은 복잡한 객체의 생성 과정을 추상화하여 단계별로 처리할 수 있는 패턴입니다. 이는 객체 생성 시에 필요한 매개변수가 많거나, 객체 생성 로직이 복잡한 경우에 유용합니다.

아래는 Python에서 Builder 패턴을 구현하는 예시입니다:

class Pizza:
    def __init__(self):
        self.dough = ""
        self.sauce = ""
        self.topping = ""

    def set_dough(self, dough):
        self.dough = dough

    def set_sauce(self, sauce):
        self.sauce = sauce

    def set_topping(self, topping):
        self.topping = topping

    def get_pizza(self):
        return f"Pizza with {self.dough} dough, {self.sauce} sauce, and {self.topping} topping"

class PizzaBuilder:
    def __init__(self):
        self.pizza = Pizza()

    def build_dough(self, dough):
        self.pizza.set_dough(dough)

    def build_sauce(self, sauce):
        self.pizza.set_sauce(sauce)

    def build_topping(self, topping):
        self.pizza.set_topping(topping)

    def get_pizza(self):
        return self.pizza.get_pizza()

builder = PizzaBuilder()
builder.build_dough("thin")
builder.build_sauce("tomato")
builder.build_topping("cheese")
pizza = builder.get_pizza()

print(pizza) # "Pizza with thin dough, tomato sauce, and cheese topping"

위의 예시에서 Pizza 클래스는 빌더 패턴을 적용할 대상이며, PizzaBuilder 클래스는 단계별로 Pizza 객체를 생성하기 위한 빌더 클래스입니다. PizzaBuilder 객체를 이용하여 원하는 속성을 설정한 뒤, get_pizza() 메서드를 통해 최종적으로 생성된 Pizza 객체를 얻을 수 있습니다.

결론

Python에서 생성 패턴과 객체 생성 처리를 효율적으로 다루기 위해 Singleton, Factory, Builder 패턴을 사용할 수 있습니다. 이러한 디자인 패턴들은 객체 생성과 관련된 복잡성을 줄이고, 코드의 재사용성과 유지 보수성을 높일 수 있습니다.