strategy pattern(전략 패턴)
template<typename T> struct IAllocator
{
virtual T* allocate(int size) = 0;
virtual void deallocate(T* p, int size) = 0;
virtual ~IAllocator() {}
};
template<typename T>
class vector
{
T* buff;
IAllocator<T>* ax;
public:
void set_allocator(IAllocator<T>* p) { ax = p; }
void resize(int n)
{
buff = ax->allocate(n);
ax->deallocate(buff, n);
}
};
template<typename T> class newAllocator : public IAllocator<T>
{
public:
T* allocate(int size) override { return new T[size]; }
void deallocate(T* p, int size) override { delete[] p; }
};
int main()
{
vector<int> v;
newAllocator<int> na;
v.set_allocator(&na);
}
IAllocator라는 메모리를 할당하기 위해서 template를 사용해 Interface를 만든다. => 어떤 Type을 인자로 받을지 모르기 때문
allocate와 deallocat는 순수 가상 함수로 두어서, 해당 interface를 사용하는 클래스들은 모두 필수적으로 두 함수를 정의 해야만한다.
class newAllocator는 new, delete를 사용해서 메모리를 할당/해지 하려고 한다.
class vector는 newAllocator를 멤버 변수로 가지고, 멤버 변수의 함수 allocate와 deallocate를 사용하여 메모리 할당/해지를 수행할 수 있다. 만약 malloc을 전문으로 하는 class를 만든다고 해도 vector입장에서는 malloc class를 멤버 변수로 가지고 있기만 하면 allocate , deallocate를 수행하면 되는 것이다.
Strategy는 각 기능들, malloc이나 , new 각 기능들을 별도의 클래스로 제공해서, vector입장에서는 어떤 class를 멤버 변수로만 가질지 정해주면 된다.
해당 코드(전략 패턴)의 장점은
메모리 할당 정책이 vector와 분리되어 있다는 점이고, list나 map 등 다른 Container를 만들어도 해당 메모리 할당/해지 class를 사용할 수 있다.
단점은
메모리 할당과 해지에 사용되는 함수가 모두 virtual이기 때문에 느리다.
'Programming > c++ Design Pattern' 카테고리의 다른 글
[C++ Design Pattern] Decorator (0) | 2023.11.29 |
---|---|
[C++ Design Pattern] Composite (1) | 2023.11.29 |
[c++ Design Pattern] Template Method (0) | 2023.11.29 |
[C++] OCP Code 예제 (1) | 2023.11.29 |
[C++] 추상 클래스 (0) | 2023.11.29 |