본문 바로가기

디자인패턴

Builder Pattern

  • 정의
    • 객체 생성 방법을 정의하는 클래스와 표현 방법을 정의하는 클래스를 별도로 분리
    • 다른 표현이라도 이를 생성할 수 있는 동일한 절차 제공
    • 구현 코드를 쉽게 변경 가능
    • 복합 객체를 구축하는 용도로 자주 사용
  • 방학 계획
public abstract class VacationBuilder {
    String name;
    List<Accommodation> accommodations = new ArrayList<Accommodation>();
    List<String> events = new ArrayList<String>();

    //숙소의 정보
    public abstract VacationBuilder addAccommodation();
    public abstract VacationBuilder addAccommodation(String name);
    public abstract VacationBuilder addAccommodation(String name, int year, int month, int day, int nights, int location);
    public abstract VacationBuilder addEvent(String event);

    public Vacation getVacation() {
        Vacation vacation = new Vacation();
        vacation.setName(name);
        vacation.setAccommodations(accommodations);
        vacation.setEvents(events);
        return vacation;
    }
}

 

public class Vacation {
    String name;
    List<Accommodation> accommodations = new ArrayList<Accommodation>();
    List<String> events = new ArrayList<String>();

    public void setName(String name){
        this.name = name;
    }

    //숙소 결정 메소드
    public void setAccommodations(List<Accommodation> accommodations) {
        this.accommodations = accommodations;
    }

    //이벤트 결정 메소드
    public void setEvents(List<String> events) {
        this.events = events;
    }
}

 

 

public class Reservation {
    LocalDate arrivalDate;
    int nights;

    //year, month, day 로 도착 일 설정
    public void setArrivalDate(int year, int month, int day) {
        this.arrivalDate = LocalDate.of(year, month, day);
    }

    public LocalDate getArrivalDate() {
        return this.arrivalDate;
    }

    //숙박 일 설정
    public void setNights(int nights){
        this.nights = nights;
    }

    public int getNights() {
        return this.nights;
    }
}

 

 

 

public abstract class Accommodation {
    String name;
    Reservation reservation = null;

    public void setReservation(Reservation r) {
        this.reservation = r;
    }

    //Reservation 클래스의 도착 일, 숙박 일 을 받아옴
    public Reservation getReservation() {
        return this.reservation;
    }
    public abstract String getLocation();

}

 

 

public class Hotel extends Accommodation {
    int roomNum;
    public Hotel() {
        this.name = "Hotel";
    }
    public Hotel(String name) {
        this.name = name;
    }
    public void setRoomNum(int n) {
        this.roomNum = n;
    }
    public int getRoomNum() {
        return this.roomNum;
    }

    public String getLocation() {
        if (roomNum == 0) return "";
        else return "Room Number" + this.roomNum;
    }
}

 

 

 

public class CityVacationBuilder extends VacationBuilder{
    public CityVacationBuilder() {
        this.name = "City Vacation Builder";
    }
    public VacationBuilder addAccommodation() {
        this.accommodations.add(new Hotel());
        return this;
    }
    public VacationBuilder addAccommodation(String name){
        this.accommodations.add(new Hotel(name));
        return this;
    }
    public VacationBuilder addAccommodation(String name, int year, int month, int day, int nights, int location) {
        Reservation reservation = new Reservation();
        reservation.setArrivalDate(year, month, day);
        reservation.setNights(nights);
        return this;
    }
    public VacationBuilder addEvent(String event) {
        this.events.add("See the" + event + "show");
        return this;
    }

}

 

 

 

public class VacationDirector {
    public static void main(String[] args) {
        VacationBuilder city = new CityVacationBuilder();
        Vacation cityVacation = city
                .addAccommodation("Grand", 2022, 06, 05, 2, 10)
                .addAccommodation("Hayat", 2022, 06, 07, 1, 11)
                .addEvent("Musical")
                .getVacation();
        System.out.println(cityVacation);
    }
}

 

 

  • 집짓기
public abstract class HouseBuilder {
    String builderName;
    enum HouseType {
        WOOD, CLAY, GINGERBREAD, STONE
    }
    HouseType houseType;
    House house = new House();

    public void setHouseType(HouseType houseType) {
        this.houseType = houseType;
        house.setHouseType(houseType);
    }

    public abstract HouseBuilder addWalls();
    public abstract HouseBuilder addRoof();
    public abstract HouseBuilder addWindows();

    public House build() {
        System.out.println("Build");
        return house;
    }

}

 

 

 

public class House {
    String name;
    HouseType houseType;
    Roof roof;
    List<Wall> walls;
    List<Window> windows;

    public House() {
        this.walls = new ArrayList<Wall>();
        this.windows = new ArrayList<Window>();
    }

    public House setHouseType(HouseType houseType) {
        this.houseType = houseType;
        switch (houseType) {
            case WOOD: this.name = "Wood House"; break;
            case CLAY: this.name = "Clay House"; break;
            case GINGERBREAD: this.name = "Gingerbread House"; break;
            case STONE: this.name = "Stone House"; break;
        }
        return this;
    }
    House addRoof(Roof roof) {
        this.roof = roof;
        return this;
    }
    House addWall(Wall wall) {
        this.walls.add(wall);
        return this;
    }
    House addWindow(Window window) {
        this.windows.add(window);
        return this;
    }
}

 

 

public class Roof {
    String name;
    String material;

    public Roof(String material) {
        this.name = "Roof made of" + material;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }
}

public class Wall {
    String name;
    String material;

    public Wall(String material) {
        this.name = "Wall made of" + material;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return this.name;
    }
}

public class Window {
    String name;
    String material;

    public Window(String material) {
        this.name = "Window made of " + material;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return this.name;
    }
}

public class InteriorWall extends Wall{
    String name;
    String material;

    public InteriorWall(String material) {
        super(material);
        this.name = "Interior wall made of " + material;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString() {
        return this.name;
    }
}

 

 

public class WoodHouseBuilder extends HouseBuilder{
    int numWalls = 6;
    int numWindows = 10;
    String windowMaterial = "Tempered Glass";
    String wallMaterial = "Wood, 4x6";
    String interiorWallMaterial = "Wood, 2x4";
    String roofMaterial = "Metal";
    public WoodHouseBuilder() {
        this.builderName = "Wood House Builder";
        setHouseType(HouseType.WOOD);
    }

    public HouseBuilder addWalls() {
        for (int i = 0; i < 4; i++) {
            System.out.println("wood for made of" + wallMaterial);
            house.addWall(new Wall(wallMaterial));
        }
        for (int i = 0; i < numWalls - 4; i++) {
            System.out.println("wood for interior wall made of" + wallMaterial);
            house.addWall(new InteriorWall(interiorWallMaterial));
        }
        return this;
    }

    public HouseBuilder addRoof() {
        house.addRoof(new Roof(roofMaterial));
        return this;
    }

    public HouseBuilder addWindows() {
        for (int i = 0; i < numWindows; i++) {
            System.out.println("Window made of" + windowMaterial);
            house.addWindow(new Window(windowMaterial));
        }
        return this;
    }

    public House build() {
        System.out.println("build Wood");
        return house;
    }
}

 

 

GitHub - Pearlmoon997/Design_Patterns: Design_Patterns

Design_Patterns. Contribute to Pearlmoon997/Design_Patterns development by creating an account on GitHub.

github.com

 

GitHub - Pearlmoon997/Design_Patterns: Design_Patterns

Design_Patterns. Contribute to Pearlmoon997/Design_Patterns development by creating an account on GitHub.

github.com

참고문서: 헤드퍼스트 디자인패턴(개정판)

'디자인패턴' 카테고리의 다른 글

Decorator Pattern_ver.02(스포츠카)  (0) 2022.05.24
Decorator Pattern_카페  (0) 2022.05.23
Singleton Pattern_ver.02  (0) 2022.05.22
Singleton Pattern  (0) 2022.05.21
Factory Method_ver.02 (햄버거)  (0) 2022.05.19