- 정의
- 객체 생성 방법을 정의하는 클래스와 표현 방법을 정의하는 클래스를 별도로 분리
- 다른 표현이라도 이를 생성할 수 있는 동일한 절차 제공
- 구현 코드를 쉽게 변경 가능
- 복합 객체를 구축하는 용도로 자주 사용
- 방학 계획
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 |