.NET/설계 패턴(C#)

[설계 패턴 C#] 11. 플라이급 패턴(Flyweight Pattern)

언제나휴일 2016. 6. 23. 13:22
반응형

11. 플라이급 패턴(Flyweight Pattern)


Flyweight.zip

"본문 내용"은 언제나 휴일 본 사이트에 있습니다.

▶ 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


반응형