디자인 패턴, 싱글톤, 상태패턴

2015. 4. 15. 08:47프로그래밍/Design Patterns

728x90
728x90
1. 디자인패턴 개요

본문 위키 : http://ko.wikipedia.org/wiki/디자인_패턴

소프트웨어 개발 방법에서 사용되는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다.

이 용어를 소프트웨어 개발 영역에서 구체적으로 처음 제시한 곳은, GoF(Gang of Four)라 불리는 네명의 컴퓨터 과학 연구자들이 쓴 서적 'Design Patterns: Elements of Reusable Object-Oriented Software'(재이용 가능한 객체지향 소프트웨어의 요소 - 디자인 패턴)이다. GoF는 컴퓨터 소프트웨어 공학 분야의 연구자인 에릭 감마, 리차드 헬름, 랄프 존슨, 존 블리시디스의 네명을 지칭한다.

2. 싱글톤 패턴

정의

해당 클래스의 인스턴스가 하나만 만들어진다.

어디서든지 그 인스턴스에 접근할 수 있도록 전역적으로 제공한다.

클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만든다.


장점

유일하게 존재하는 인스턴스의 접근을 통제한다.

전역변수처럼 인스턴스에 접근할 수 있으며 시스템의 자원을 효율적으로 사용할 수 있다.

인스턴스가 하나만 필요한 클래스일 때 무분별한 객체 생성을 막을 수 있다.


단점

일반적인 전역 변수의 단점과 비슷하다.(동시접근, 코드 변경시 여러 부분에 영향을 미침(의존도))

정확히 인스턴스가 생성되는 시점을 유추하기 어렵다.


예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class SingleTon
{
public:
    ~SingleTon(void);
 
    static SingleTon* getInstance(void)
    {
        static SingleTon inst;
        return &inst;
    }
 
private:
    //< 생성자를 private으로 만들어 객체 생성을 제한한다.
    SingleTon(void);
};
cs


3. 상태패턴

정의

객체 내부 상태에 따라 행위를 변경할 수 있는 패턴.

일련의 행동을 정의한 메소드지만 객체의 상태에 따라 다른 기능을 수행한다.

C++에선 오버라이딩을 통한 다형성을 이용하여 구현할 수 있다.


장점

서로 다른 상태에 대한 행동을 별도의 객체로 관리할 수 있다.

상태 전이를 명확하게 한다.

상태 객체를 공유할 수 있다.


단점

상태 패턴은 조건문과 분기문에 비해 명시적이지 않다.

객체 생성과 소멸 시점에 주의해야 한다.


예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;
 
//< 아이템 베이스 클래스
class Item
{
public :
    //< 아이템 사용 추상 클래스
    virtual void use( void ) = 0;
};
 
//< 포션 파생 클래스
class Potion : public Item
{
public :
    //< 오버라이딩
    virtual void use(void) override
    {
        cout<<"물약 사용!"<<endl;
    }
};
 
//< 장비 파생 클래스
class Equiq : public Item
{
public :
    //< 오버라이딩
    virtual void use( void ) override
    {
        cout<<"장비 착용!"<<endl;
    }
};
 
void main( void )
{
    //< 아이템 객체 생성
    Item *state;
    Item *oldState;
 
    //< 포션 객체를 가리키고 use를 실행
    state = new Potion;
    state->use();
 
    oldState = state;
 
    //< 장비 객체를 가리키고 use를 실행
    state = new Equiq;
    state->use();
 
    //< 동적할당 해제
    delete state;
    delete oldState;
}
cs




728x90
반응형

'프로그래밍 > Design Patterns' 카테고리의 다른 글

[Design Pattern] 싱글톤  (2) 2016.02.15
[Design Pattern] 팩토리 패턴  (2) 2016.01.30
디자인 패턴 연관도  (1) 2015.07.08
중재자 패턴  (2) 2015.05.04
싱글톤 사용하기  (2) 2015.04.21
[Design Pattern] 옵저버 패턴 개요  (0) 2015.04.18