[c++] 객체지향 설계 패턴

객체지향 프로그래밍에서 사용되는 다양한 설계 패턴은 소프트웨어의 유연성, 확장성, 유지보수성을 향상시키기 위한 중요한 도구로서, 프로그래밍 문제를 해결하는 데 도움이 됩니다. 이러한 패턴은 객체 및 클래스 간의 상호 작용을 구조화하고, 객체 간의 관계를 정의하며, 재사용 가능한 솔루션을 제공합니다.

객체지향 설계 패턴은 크게 생성(Creational), 구조(Structural), 행위(Behavioral) 세 가지 범주로 나뉩니다.

생성 패턴 (Creational Patterns)

팩토리 메서드 (Factory Method)

팩토리 메서드 패턴은 인스턴스화할 클래스를 서브 클래스에서 결정하도록 하는 패턴입니다. 이를 통해 객체 생성 로직을 캡슐화하여 유연성을 높일 수 있습니다.

예시:

class Product {
public:
    virtual void operation() = 0;
};

class ConcreteProduct : public Product {
public:
    void operation() override { /* 구현 */ }
};

class Creator {
public:
    virtual Product* factoryMethod() = 0;
    void someOperation() {
        Product* product = factoryMethod();
        // 다른 작업 수행
    }
};

class ConcreteCreator : public Creator {
public:
    Product* factoryMethod() override {
        return new ConcreteProduct();
    }
};

구조 패턴 (Structural Patterns)

어댑터 (Adapter)

어댑터 패턴은 서로 호환되지 않는 인터페이스를 갖는 두 개의 클래스를 함께 사용할 수 있도록 하는 패턴입니다. 이를 통해 기존의 코드를 수정하지 않고도 클래스 간의 상호 작용을 촉진할 수 있습니다.

예시:

class Target {
public:
    virtual void request() = 0;
};

class Adaptee {
public:
    void specificRequest() { /* 구현 */ }
};

class Adapter : public Target {
private:
    Adaptee* adaptee;
public:
    void request() override {
        adaptee->specificRequest();
    }
};

행위 패턴 (Behavioral Patterns)

전략 (Strategy)

전략 패턴은 알고리즘을 캡슐화하고, 동적으로 교체할 수 있도록 하는 패턴입니다. 이를 통해 객체 간의 의존성을 줄이고, 유연한 설계를 가능하게 합니다.

예시:

class Strategy {
public:
    virtual void doAlgorithm() = 0;
};

class ConcreteStrategyA : public Strategy {
public:
    void doAlgorithm() override { /* 알고리즘 A 구현 */ }
};

class ConcreteStrategyB : public Strategy {
public:
    void doAlgorithm() override { /* 알고리즘 B 구현 */ }
};

class Context {
private:
    Strategy* strategy;
public:
    void setStrategy(Strategy* newStrategy) {
        strategy = newStrategy;
    }
    void execute() {
        strategy->doAlgorithm();
    }
};

마무리

객체지향 설계 패턴은 소프트웨어의 유연성 및 확장성을 향상시키는 데 큰 도움이 됩니다. 이를 통해 쉽게 유지보수 가능한 소프트웨어를 설계하고, 재사용 가능한 코드를 작성할 수 있습니다.