구조개선을 위한 패턴
객체의 공유
Flyweight Pattern
23기 김지민
Flyweight Pattern 목적의도
프로그램을 개발 하다 보면 크게 2가지 목적에서 “공유”를 고려하게 된다.
1. 논리적 관점에서의 공유
2. 구현 측면에서 컴퓨터 자원을 효율적으로 사용하기 위한 공유
구현 차원에서 자원 사용 효율화를 위한 설계 방법 중 하나인 Flyweight 패턴이다
목적의도
작은 공간(pool)을 만들어 객체를 공유할 수 있게 해 객체 생성을 최대한 줄여 주며
구현 차원에서 컴퓨터 자원 사용 효율화를 위한 공유문제를 해결하기 위한 설계 방법으로
작은 크기의 객체들을 효과적으로 사용하는 방법으로 객체를 “공유한다” 라고 정의한다.
또한 응용프로그램에서 특정한 객체를 다수 만들어야 할 때 사용한다
여기서 중요한 것은 공유라는 점이다. 이 이유로 인해
Flyweight 패턴을 사용하면 이름처럼 경량 구조를 제공할 수 있게 된다.
개체관계도

공유 방법에 따라 정보를 공유하기 위한
클래스 구조와 실제 정보가 공유되는 객체 관계도
Flyweight 패턴은 이 부분을 내부(intrinsic, 선의 색) 상태와 외부(extrinsic, 위치나 길이)
상태로 나눠서 해결한다. 내부 상태는 유지하는 반면에, 외부 상태는 Flyweight 객체가 실행 되는 동안만 유지합니다.
따라서 객체를 손쉽게 변화시켜 재사용 할 수 있습니다.
Flyweight Pattern 특징
정보를 공유하기 위해 공유 가능한 정보와 그렇지 않은 정보를 분리
공유 가능한 정보를 객체 형태로 정의해서 정보 공유를 수행하는 형태의 설계
ex) 흰색 선과 파란 선을 그린다고 할 때 각각의 색을 가진 선 객체는 FlyweightFactory에서
만들어져 흰색 선과 파란 선을 그릴때 언제든지 재사용 할 수 있습니다. 따라서 1000개의 흰색 선과
2000개의 파란 선을 그린다고 할 때 3000개의 객체를 생성하는 대신 두 개의 인스턴스만 만들 것입니다
예제

예제 + 코드
#include <string>
#include <iostream>
using std::cout;
using std::endl;
using std::string;
enum MajorType
{
COMPUTER,
ELECTRONICS,
KOREAN,
ENGLISH
};
class Major
{
string mname;
string description;
Major(string _mname,string _description):
mname(_mname),description(_description)
{}
friend class MajorFactory;
public:
void View()
{
cout<<mname<<endl;
cout<<description<<endl;
}
};
class MajorFactory
{
Major *majors[ENGLISH];
static MajorFactory mf;
MajorFactory()
{
majors[COMPUTER] = new Major("컴퓨터","C언어, C++");
majors[ELECTRONICS] = new Major("전자","회로,반도체");
majors[KOREAN]=new Major("국문학","한글,한국현대소설");
majors[ENGLISH]=new Major("영문학","english,ehclub");
}
~MajorFactory()
{
int i = 0;
for(i=COMPUTER;i<ENGLISH;i++)
{
delete majors[i];
}
}
public:
static MajorFactory *GetSingleton()
{
return &mf;
}
Major *GetMajor(MajorType mt)
{
return majors[mt];
}
};
MajorFactory MajorFactory::mf;
class Stu
{
MajorType mt;
int num;
public:
Stu(int _num,MajorType _mt):num(_num),mt(_mt){}
void View()
{
cout<<num<<"번 학생"<<endl;
MajorFactory *mf = MajorFactory::GetSingleton();
Major *m = mf->GetMajor(mt);
m->View();
}
};
//class Stu //플라이웨이트 패턴 적용 전
//{
// Major *m;
// int num;
//public:
// Stu(int _num,MajorType _mt):num(_num)
// {
// switch(_mt)
// {
// case COMPUTER: m = new Major("컴퓨터","C언어, C++"); break;
// case ELECTRONICS: m = new Major("전자","회로, 반도체"); break;
// case KOREAN: m = new Major("국문학","한글, 한국현대소설"); break;
// case ENGLISH: m = new Major("english", "ehglish, ehclub"); break;
// }
// }
// void View()
// {
// cout<<num<<"번 학생"<<endl;
// //MajorFactory *mf = MajorFactory::GetSingleton();
// //Major *m = mf->GetMajor(mt);
// m->View();
// }
//};
void main()
{
Stu *s[100]={0,};
MajorType mt;
for(int i = 0;i<100;i++)
{
mt =(MajorType)(rand()%ENGLISH);
s[i] = new Stu(i+1,mt);
}
for(int i = 0;i<100;i++)
{
s[i]->View();
}
for(int i = 0;i<100;i++)
{
delete s[i];
}
}
수정중..
Flyweight 패턴.pptx
FlyweightPattern.zip
Flyweight패턴.docx