Design Pattern

flyweight pattern

sseram 2022. 12. 1. 21:33
반응형

flyweight pattern
정의 : 플라이웨이트 패턴는 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴이다.

 

 

핵심 : 속성이 동일한 객체는 공유 할 수 있도록 만들자. flyweight

 

 

#include <iostream>
#include <string>
#include <map>


// 속성이 동일한 객체는  공유 할수 있게 하자. - Flyweight 


class Image
{
	std::string image_url;
public:
	Image(const std::string& url) : image_url(url)
	{
		std::cout << url << " Downloading..." << std::endl;
	}
	void Draw() { std::cout << "Draw image!" << image_url << std::endl; }
};





int main()
{
	Image* img1 = new Image("www.someurl.com/a.png");
	img1->Draw();

	Image* img2 = new Image("www.someurl.com/a.png");
	img2->Draw();

}

 

 

위와 같은 코드가 있다고 하자.

 

Image 라는 class를 만들 때 어떠한 url을 주면, 해당 url에서 다운로드 받아 그리는 함수이다.

실행시켜 보면 다음과 같이 나온다.

 

 

 

그런데 생각해 보면... 같은 url에서 다운받는 것인데 굳이 두 번이나 받는게 비효율적으로 보인다.

한 번 만들어 두면, 다음번에 동일한 것을 다운받지 않고,이미 다운받은 것을 보여주면 어떨까?

 

위의 아이디어를 채용하여 코드를 조금 바꿔 보았다.

 

#include <iostream>
#include <string>
#include <map>

class Image
{
	std::string image_url;

	Image(const std::string& url) : image_url(url)
	{
		std::cout << url << " Downloading..." << std::endl;
	}
public:
	void Draw() { std::cout << "Draw " << image_url << std::endl; }

	static std::map<std::string, Image*> image_map;

	static Image* Create(const std::string& url)
	{
		Image* p = image_map[url];
		
		if (p == nullptr)
		{
			p = new Image(url);
			image_map[url] = p;
		}

		return p;
	}
};
std::map<std::string, Image*> Image::image_map;

int main()
{
	Image* img1 = Image::Create("www.someurl.com/a.png");
	img1->Draw();

	Image* img2 = Image::Create("www.someurl.com/a.png");
	img2->Draw();

}

 

위처럼 자신의 객체를 만드는 static 맴버 함수를 제공해준다 (Create)

 

해당 create를 사용한다면, 이미 만들어져 있는 동일한 객체가 있다면 새롭게 만들지 않고 원래 만들어져 있던 것을 건내주게 된다.

 

실행하면 다음과 같아진다.

 

 

 

 

 

 

 

추가로... 다음과 같은 코드가 있다고 하자.

 

#include <iostream>

int main()
{
	char  sa[] = "hello";
	char* sp   = "hello";
}

 

위 코드는 C에서는 에러가 아니다.

하지만 C++ 에서는 에러가 난다.

 

 

 

이렇게.

C++에서 문자열 포인터는 상수 메모리를 가리킨다. 그러니 해당 코드는

char* sp가 아니라

const char* sp로 바꾸어야 정상적으로 작동이 된다.

 

상수 메모리를 가리킨다고 하면... 새로운 const char* 이 만들어질 때마다 새롭게 할당을 하는 것일까?

 

#include <iostream>

int main()
{
	const char* p1 = "hello";
	const char* p2 = "hello";

	printf("p1 : [%p], p2 : [%p]\n", p1, p2);
}

 

 

이렇게 코드를 짜 두고 출력을 하면...

 

 

 

이런 식으로, p1 p2 다르지만 같은 곳을 가리키고 있다.

 

 

 

... 사실 std::string쓰면 크게 알 필요없는 문제이긴 하다.

반응형

'Design Pattern' 카테고리의 다른 글

[Design Pattern] state pattern  (0) 2023.05.19
iterator pattern  (0) 2022.11.20
Template Method  (0) 2022.09.06
Observer Pattern  (0) 2022.08.14
Decorator pattern  (0) 2022.07.26