Overview

빌더 패턴은 공장에서 만드는 것보다 쉽습니다.
미리 디자인북을 가져오세요.
모든 비행기는 같은 영역으로 나눌 수 있습니다.
Wings, PowerPlant, Avionics, Seats 등
구성 요소는 평면과 다르지만 사이트는 동일합니다.
비행기가 공장에 들어오면 디자인에 따라 다른 붐이 들어옵니다.
다른 부품들로 구성되어 최종적으로 조립과정을 거쳐 완성됩니다.

장점
1. 필요한 데이터만 설정할 수 있습니다.
2. 유연성을 확보할 수 있다.
3. 가독성을 높일 수 있습니다.
4. 불변성을 확보할 수 있다.

 

Structure

https://ko.wikipedia.org/wiki/%EB%B9%8C%EB%8D%94_%ED%8C%A8%ED%84%B4

 

Code Example

package com.example.design.pattern;

class AirplaneProduct {
	private String type;
	private float wingspan;
	private String powerplant;
	private int crewSeats;
	private int passengerSeats;
	private String avionics;
	private String customer;

	AirplaneProduct(String customer, String type) {
		this.customer = customer;
		this.type = type;
	}

	public void setWingspan(float wingspan) {
		this.wingspan = wingspan;
	}

	public void setPowerplant(String powerplant) {
		this.powerplant = powerplant;
	}

	public void setAvionics(String avionics) {
		this.avionics = avionics;
	}

	public void setNumberSeats(int crewSeats, int passengerSeats) {
		this.crewSeats = crewSeats;
		this.passengerSeats = passengerSeats;
	}

	public String getCustomer() {
		return customer;
	}

	public String getType() {
		return type;
	}
}

abstract class AirplaneBuilder {
	protected AirplaneProduct airplane;
	protected String customer;
	protected String type;

	public AirplaneProduct getAirplane() {
		return airplane;
	}

	public void createNewAirplane() {
		airplane = new AirplaneProduct(customer, type);
	}

	public abstract void buildWings();

	public abstract void buildPowerplant();

	public abstract void buildAvionics();

	public abstract void buildSeats();
}

class CropDuster extends AirplaneBuilder {
	CropDuster(String customer) {
		super.customer = customer;
		super.type = "Crop Duster v3.4";
	}

	public void buildWings() {
		airplane.setWingspan(9f);
	}

	public void buildPowerplant() {
		airplane.setPowerplant("single piston");
	}

	public void buildAvionics() {
	}

	public void buildSeats() {
		airplane.setNumberSeats(1, 1);
	}
}

class FighterJet extends AirplaneBuilder {
	FighterJet(String customer) {
		super.customer = customer;
		super.type = "F-35 Lightning II";
	}

	public void buildWings() {
		airplane.setWingspan(35.0f);
	}

	public void buildPowerplant() {
		airplane.setPowerplant("dual thrust vectoring");
	}

	public void buildAvionics() {
		airplane.setAvionics("military");
	}

	public void buildSeats() {
		airplane.setNumberSeats(1, 0);
	}
}

class AerospaceEngineerDirector {
	private AirplaneBuilder airplaneBuilder;

	public void setAirplaneBuilder(AirplaneBuilder ab) {
		airplaneBuilder = ab;
	}

	public AirplaneProduct getAirplane() {
		return airplaneBuilder.getAirplane();
	}

	public void constructAirplane() {
		airplaneBuilder.createNewAirplane();
		airplaneBuilder.buildWings();
		airplaneBuilder.buildPowerplant();
		airplaneBuilder.buildAvionics();
		airplaneBuilder.buildSeats();
	}
}

public class MyBuilder {
	public static void main(String[] args) {
		AerospaceEngineerDirector aero = new AerospaceEngineerDirector();
		// instantiate each concrete builder (take orders)
		AirplaneBuilder crop = new CropDuster("Farmer Joe");
		AirplaneBuilder fighter = new FighterJet("The Navy");

		aero.setAirplaneBuilder(crop);
		aero.constructAirplane();
		AirplaneProduct completedCropDuster = aero.getAirplane();

		System.out.println(completedCropDuster.getType() + " is completed and ready for delivery to "
				+ completedCropDuster.getCustomer());

	}
}

 

Console Result

Crop Duster v3.4 is completed and ready for delivery to Farmer Joe

 

Conclusion

Builder pattern is provided as a lombok plugin, so it is easy to use.

Import lombok.builder;
...
@Builder (BuilderMethodName = "Newbuilder", setterPrefix = "set")
Public Class Node IMPLEETS Serializable {
...
Node.newbuilder (). Build ();
...

 

728x90
1···464748495051
반응형

+ Recent posts