Builder pattern

UML 2021. 1. 9. 00:43
반응형

생성 패턴 

복잡한 객체를 생성할때 사용하는 생성 디자인 패턴 

Builder클래스에 객체를 생성하기 위해 필요한 여러 스탭(기능)들을 정의하고 

Director라는 또다른 클래스에서 이러한 Builder의 여러 스탭(기능)들을 필요에 따라 선택하여 객체를 Build하게 됨 

하나의 클래스에서 직접 여러부품을 조합해서 복잡한 객체를 만들어 내는 방식은 유연한 방식이 아님 

이렇게 하면 그 클래스는 하나의 복합 객체를 표현할수 있게 되지만 

그 클래스를 변경하지 않으면 이후 다른 조합의 복합 객체를 만드는것이 힘들어짐 

Builder패턴은 생성과정과 복합객체의 표현을 분리 하는 패턴임 

복합 객체를 구성하는 부품 (스탭)들을 Builder에 정의 하고 

외부 클래스에서 복합 객체를 만들때 이들 부품들을 조합해 복합 객체를 만들도록 하는 방식임 

이러한 방식을 사용하면  Builder에 정의된 동일한 부품 생성과정을 사용하면서 

조합을 어떻게 하는가에 따라 다양한 복합 객체들을 표현 할수 있음 

builder pattern

 

using System;

namespace ConsoleApp1
{
    public class App
    {
        public App() {
            ICarBuilder builder = new SantafeBuilder(SantafeBuilder.eModelType.GASOLINE_TURBO_2_5);
            var director = new SantafeDirector();
            var car = director.Construct(builder);
            Console.WriteLine(car.ToString());

            Console.WriteLine();

            ICarBuilder builder2 = new SantafeBuilder(SantafeBuilder.eModelType.DIESEL_2_2);
            var car2 = director.Construct(builder2);
            Console.WriteLine(car2.ToString());
        }
    }
}
using System;

namespace ConsoleApp1
{
    public class Car
    {
        public string Frame { get; set; }
        public string Engine { get; set; }
        public string Displacement { get; set; }    //배기량 
        public string Fuel { get; set; }    //연료 
        public string Wheels { get; set; }

        private string name;
        public SantafeBuilder.eModelType ModelType { get; private set; }
        public Car(string name, SantafeBuilder.eModelType modelType)
        {
            this.name = name;
            this.ModelType = modelType;
        }

        public override string ToString()
        {
            return string.Format("{0}\n{1}\n{2}\n{3}\n{4}", this.name, this.ModelType, this.Frame, this.Engine, this.Wheels);
        }
    }
}
namespace ConsoleApp1
{
    public interface ICarBuilder
    {
        void CreateFrame();
        void CreateWheel();
        void CreateEngine();
        Car Build();
    }
}
namespace ConsoleApp1
{
    public class SantafeBuilder : ICarBuilder
    {
        public enum eModelType
        {
            GASOLINE_TURBO_2_5,         //2.5 가솔린 터보
            DIESEL_2_2,                 //2.2 디젤
            GASOLINE_TURBO_2_5_AWD,     //2.5 가솔린 터보...
            DIESEL_2_2_AWD              //2.2 디젤 AWD
        }

        private Car car;

        public SantafeBuilder(eModelType modelType) { 
            this.car = new Car("Santafe", modelType);
        }
        public Car Build()
        {
            return this.car;
        }

        public void CreateEngine()
        {
            this.car.Engine = "I4 싱글 터보";

            switch (this.car.ModelType) {
                case eModelType.GASOLINE_TURBO_2_5:
                    this.car.Displacement = "2,497cc";
                    this.car.Fuel = "가솔린";
                    break;

                case eModelType.DIESEL_2_2:
                    this.car.Displacement = "2,151cc";
                    this.car.Fuel = "디젤";
                    break;

            }
        }

        public void CreateFrame()
        {
            this.car.Frame = "3세대 플랫폼";
        }

        public void CreateWheel()
        {
            this.car.Wheels = "18 인치";
        }
    }
}
using System;

namespace ConsoleApp1
{
    public class SantafeDirector
    {
        public Car Construct(ICarBuilder builder) {
            builder.CreateFrame();
            builder.CreateEngine();
            builder.CreateWheel();

            Car car = builder.Build();
            return car;
        }
    }
}

참고

en.wikipedia.org/wiki/Builder_pattern

auto.naver.com/car/lineup.nhn?yearsId=139601

 

반응형

'UML' 카테고리의 다른 글

StarUML Instantiate (dependency)  (0) 2021.03.17
starUML 예제  (0) 2021.03.17
아이템설계  (0) 2017.04.13
UML Class Diagram Relationships, Aggregation, Composition  (0) 2016.10.13
Sign up UML association vs. composition and detail level  (0) 2016.10.13
: