11. 플라이급 패턴(Flyweight Pattern)
"본문 내용"은 언제나 휴일 본 사이트에 있습니다.
▶ Meta.cs
using System;
namespace Flyweight
{
//사진 촬영 조건에 관한 열거형 정의
public enum BodyType { EH_BA, EH_BB, EH_BC };
public enum LensType { EH_L1, EH_L2, EH_L3 };
public enum LightType { LT_CLEAR, LT_CLOUDY, LT_LAMP };
class Meta //사진 파일들이 공유할 수 있는 촬영 조건을 정의한 클래스
{
static readonly string[] bodyname = {"EH_BA","EH_BB","EH_BC"};
static readonly string[] lensname = { "EH_L1", "EH_L2", "EH_L3" };
static readonly string[] lightname = { "맑음", "흐림", "램프" };
//촬영 조건에 대한 속성들
public BodyType Body
{
get;
private set;
}
public LensType Lens
{
get;
private set;
}
public LightType Light
{
get;
private set;
}
readonly int seq; //일련번호
static int scnt; //Meta 개체 수
public Meta(BodyType body,LensType lens,LightType light)
{
scnt++;
seq = scnt; //개체 생성 순으로 일련번호 부여
Body= body;
Lens = lens;
Light = light;
}
// 촬영조건이 같은지 확인하는 메서드
public bool IsEqual(BodyType body,LensType lens,LightType light)
{
return (Body==body)&&(Lens==lens)&&(Light==light);
}
public void View()
{
Console.WriteLine("일련번호:{0}", seq);
Console.WriteLine("Body:{0}",bodyname[(int)Body]);
Console.WriteLine("Lens:{0}", bodyname[(int)Lens]);
Console.WriteLine("Light:{0}", bodyname[(int)Light]);
}
}
}
▶ MetaPool.cs
using System.Collections.Generic;
namespace Flyweight
{
class MetaPool // Meta 개체들을 관리하는 클래스
{
List<Meta> metas = new List<Meta>(); //Meta 개체 보관하는 컬렉션
public static MetaPool Singleton //단일체 속성
{
get;
private set;
}
static MetaPool()//단일체를 생성하는 정적 생성자
{
Singleton = new MetaPool();
}
private MetaPool()//단일체 구현을 위해 private으로 접근 지정
{
}
//촬영 조건에 해당하는 Meta 개체를 반환하는 메서드
public Meta MakeMeta(BodyType body,LensType lens,LightType light)
{
//같은 촬영 조건의 Meta 개체가 있으면 해당 개체를 반환
foreach (Meta meta in metas)
{
if (meta.IsEqual(body, lens, light))
{
return meta;
}
}
//없을 때
Meta m = new Meta(body,lens,light); //새로운 Meta 개체 생성
metas.Add(m); //컬렉션에 보관
return m;
}
}
}
▶ PictureFile.cs
using System;
namespace Flyweight
{
class PictureFile
{
string name;
Meta meta; //사진을 찍을 때의 환경 정보
public PictureFile(string name,BodyType body,LensType lens,LightType light)
{
MetaPool meta_pool = MetaPool.Singleton;
//환경 정보에 맞는 Meta 개체를 MetaPool에게 요청하여 참조 함
meta = meta_pool.MakeMeta(body,lens,light);
}
public void View()
{
Console.WriteLine("사진 이름:{0}",name);
meta.View();
}
}
}
▶ Program.cs
namespace Flyweight
{
class Program
{
static void Main(string[] args)
{
BodyType body_type = BodyType.EH_BA;
LensType lens_type = LensType.EH_L1;
LightType light_type = LightType.LT_CLEAR;
PictureFile pf = new PictureFile("사진", body_type, lens_type, light_type);
PictureFile pf2 = new PictureFile("사진", body_type, lens_type, light_type);
pf.View();
pf2.View();
}
}
}
▶ 실행 결과
사진 이름:
일련번호:1
Body:EH_BA
Lens:EH_BA
Light:EH_BA
사진 이름:
일련번호:1
Body:EH_BA
Lens:EH_BA
Light:EH_BA
'.NET > 설계 패턴(C#)' 카테고리의 다른 글
[설계 패턴 C#]13. 프락스 패턴(Proxy Pattern) - 가상 프락시 (0) | 2016.06.24 |
---|---|
[설계 패턴 C#]12. 프락스 패턴(Proxy Pattern) - 원격지 프락시 (0) | 2016.06.23 |
[설계 패턴 C#] 10. 퍼샤드 패턴 (0) | 2016.06.09 |
[설계 패턴 C#] 9. 장식자 패턴 (0) | 2016.06.09 |
[설계 패턴 C#] 8. 복합체 패턴 (0) | 2016.06.09 |