프로그래밍 기술/Escort GoF의 디자인 패턴 C#

[C#] 2. 빌더 패턴(Builder Pattern) - 구현

언제나휴일 2016. 4. 25. 11:52
반응형

2. 빌더 패턴(Builder Pattern)



Builder.zip


2. 4 구현

 

 이제 빌더 패턴에 대한 예제 프로그램을 구현해 봅시다. 구현 순서는 사진, 사진 빌더, 카메라 순으로 하겠습니다.

 

2.4.1 사진

 

 사진은 피사체와 이에 대한 이미지를 갖는 형식으로 정의를 할께요.

 

Picture.cs

namespace Builder

{

    class Picture

    {

        public static readonly Picture EmptyPicture;

        static Picture()

        {

            EmptyPicture = new Picture(string.Empty, string.Empty);

        }

        public string Subject    {    get;    private set;    }

        public string Image     {     get;   private set;    }

        public Picture(string subject, string image)

        {

            Subject = subject;

            Image = image;

        }

    }

}

  

2.4.2 사진 빌더

 

 사진 빌더는 빛을 모아 피사체를 이미지로 맺히는 역할과 수정작업을 수행하는 역할을 합니다. 추상 클래스 PictureBuilder에는 이들 기능에 대한 약속을 합니다.

 

PictureBuilder.cs

namespace Builder

{

    abstract class PictureBuilder

    {

        public Picture Picture

        {

            get;

            protected set;

        }

        public abstract void SetSubject(string subject); //상을 맺히는 기능

        public abstract void Change();//이미지를 수정하는 기능

    }

}

  

 SmoothBuilder에서는 약속한 기능을 구체적으로 구현해야 합니다. 상을 맺히는 기능은 피사체를 그대로 이미지로 맺히게 구현할게요. 그리고 이미지를 수정하는 기능은 날카로운 부분을 부드럽게 바꾸게 구현합시다.

 

SmoothBuilder.cs

namespace Builder

{

    class SmoothBuilder:PictureBuilder

    {

        const string sharp = "Sharp";

        const string smooth = "Smooth";

        string subject;  //원본 피사체

        public override void SetSubject(string subject) //상을 맺히는 기능

        {

            this.subject = subject;

            Picture = new Picture(subject, subject);

        }

        public override void Change()//이미지를 수정하는 기능

        {

            string image = subject.Replace(sharp,smooth);

            Picture= new Picture(subject,image);

        }

    }

}

  

 REPreventBuilder에서도 약속한 기능을 구체적으로 구현해야 합니다. 상을 맺히는 기능은 피사체의 일부분만 이미지로 맺히게 구현할게요. 그리고 이미지를 수정하는 기능은 적목을 일반적인 눈으로 바꾸게 구현합시다.

 

REPreventBuilder.cs

namespace Builder

{

    class REPreventBuilder:PictureBuilder

    {

        const string red_eye = "RedEye";

        const string normal_eye = "NomalEye";

        const int max_length = 20;

        string subject;

 

        public override void SetSubject(string subject) //상을 맺히는 기능

        {

            if (subject.Length > max_length)

            {

                subject = subject.Substring(0, max_length);

            }

            this.subject = subject;

        }

       

        public override void Change()//이미지를 바꾸는 기능

        {

            string image = subject.Replace(red_eye, normal_eye);

            Picture = new Picture(subject, image);

        }

    }

}

 

 

2.4.3 카메라

 

 카메라에는 셔터를 누르면 피사체를 사진으로 만들어주는 기능이 있어야 할 것입니다. 이러한 기능을 PressAShutter라 하고 피사체와 낮인지 밤인지를 구별할 수 있는 입력 인자로 받아서 빌더를 이용하여 상을 맺히고 수정하게 구현할게요.

 

Camera.cs

namespace Builder

{

    class Camera

    {

        PictureBuilder[] builders = new PictureBuilder[2];

        public Picture MyPicture    {    get;    private set;    }

        public Camera()

        {

            builders[0] = new REPreventBuilder();

            builders[1] = new SmoothBuilder();

            MyPicture = Picture.EmptyPicture;

        }

        public void PressAShutter(string origin,bool night)

        {

            PictureBuilder pb = null;

            if (night){    pb = builders[0];    } //밤일 때

            else{    pb = builders[1];    } //밤이 아닐 때

 

            pb.SetSubject(origin); //상을 맺힌다.

            pb.Change(); //이미지를 수정한다.

            MyPicture = pb.Picture;

        }

    }

}

  

Program.cs

using System;

namespace Builder

{

    class Program

    {

        static void Main(string[] args)

        {

            Camera camera = new Camera();

            camera.PressAShutter("길 마당 RedEyeSharpBody 집 산 ",true);

            Console.WriteLine(camera.MyPicture.Image);

            camera.PressAShutter("길 마당 RedEyeSharpBody 집 산",false);

            Console.WriteLine(camera.MyPicture.Image);

        }

    }

}

 

▶실행 결과

길 마당 NomalEyeSharpBody

길 마당 RedEyeSmoothBody 집 산

 

2016/04/25 - [프로그래밍 기술/Escort GoF의 디자인 패턴 C#] - [C#] 2. 빌더 패턴(Builder Pattern) - 개요, 시나리오


2016/04/25 - [프로그래밍 기술/Escort GoF의 디자인 패턴 C#] - [C#] 2. 빌더 패턴(Builder Pattern) - 설계


반응형