본문 바로가기

개인공부/소프트웨어 개발 패턴

(생성패턴) Builder 빌더 디자인 패턴

빌더 패턴이란 복잡한 오브젝트의 생성과 표현을 분리하는 과정으로 동일한 생성과정으로 다양한 표현(구현) 이 가능하다.

 

예를 들어 곧 보여줄 코드 예시에서 나올 탈 것이라는 클래스로 여러가지 탈것을 구현하고싶다면 

각 탈 것마다 생성자를 만들어주지않고 각각 탈 것에 빌더클래스를 만들어줘 탈 것의 엔진, 바퀴, 외형들을 구현하는

클래스를 구현하고

 

Director 라는 클래스를 이용해 모든 빌더를 실행시키면 코드 가독성이 높아진다.

 

 

말이 길어져서 헷깔릴 수 있는데 추상메서드를 쓰는대신 탈 것 이라는 클래스를 만들고 (뼈대) 생성자는 만들지 않고

필드만 선언한다 ex) 바퀴, 엔진, 외형 등등

 

이 후 

각 종류의 탈 것에 해당하는 빌더를 만들어서 각 종류의 탈 것에 어울리는 디테일을 붙여 준 후 (여기에서도 생성자는 만들지않는다) 디렉터라는 클래스 하나가 생성자 역할을 해주는 것이다.

 

 

코드예시)

 

탈 것 

    public class Vehicle
    {
        public string Type;
        public string EngineType;
        public int NumberOfWheels;
        public int NumberOfSeats;
        public int NumberOfDoors;

    }

 

빌더 ( 예시는 많지만 하나만 쓰겠다.)

 public class SedanBuilder : IVehicleBuilder
 {
     private Vehicle _vehicle;
     public void BuildDoors()
     {
         _vehicle.NumberOfDoors = 4;
     }

     public void BuildEngine()
     {
         _vehicle.EngineType = "4 Cylinder";
     }

     public void BuildSeats()
     {
         _vehicle.NumberOfSeats = 5;
     }

     public void BuildVehicle()
     {
         _vehicle = new Vehicle();
         _vehicle.Type = "Sedan";
     }

     public void BuildWheels()
     {
         _vehicle.NumberOfWheels = 4;
     }

     public Vehicle GetVehicle()
     {
         return _vehicle;
     }
 }

 

 

디렉터 (생성자)

 

    public class Director
    {
        public Vehicle BuildVehicle(IVehicleBuilder builder)
        {
            builder.BuildVehicle();
            builder.BuildDoors();
            builder.BuildEngine();
            builder.BuildSeats();
            builder.BuildWheels();
            return builder.GetVehicle();
        }
    }

 

 

 

메인 

 

 class Program
 {
     static void Main(string[] args)
     {
         var director = new Director();

         var vehicles = new List<Vehicle>();
         vehicles.Add(director.BuildVehicle(new SedanBuilder()));
         vehicles.Add(director.BuildVehicle(new TricycleBuilder()));
         vehicles.Add(director.BuildVehicle(new SevenFortySevenBuilder()));

         foreach(var vehicle in vehicles)
         {
             Console.WriteLine($"Type:    {vehicle.Type}");
             Console.WriteLine($"Engine:  {vehicle.EngineType}");
             Console.WriteLine($"Seats:   {vehicle.NumberOfSeats}");
             Console.WriteLine($"Doors:   {vehicle.NumberOfDoors}");
             Console.WriteLine($"Wheels:  {vehicle.NumberOfWheels}");
             Console.WriteLine();
         }
     }
 }

 

 

 

결과

 

Type:    Sedan
Engine:  4 Cylinder
Seats:   5
Doors:   4
Wheels:  4

Type:    Tricycle
Engine:  Pedals
Seats:   1
Doors:   0
Wheels:  3

Type:    747
Engine:  4 Jet Engines
Seats:   416
Doors:   4
Wheels:  16