public class MethodChainingOrderBuilder {
public final Order order = new Order(); // 주문을 빌더로 감쌌다.
private MethodChainingOrderBuilder(String customer) {
order.setCustomer(customer);
}
public static MethodChaingOrderBuilder forCustomer(String customer) {
return new MethodChaningOrderBuilder(customer);
} // 고객의 주문을 만드는 적정 팩토리 메서드
public TreadeBuilder buy(int quantity) {
return new TradeBuilder(this, Trade.Type.BUY, quantity); //주식을 사는 빌더 만들기
}
public TreadeBuilder sell(int quantity) {
return new TradeBuilder(this, Trade.Type.SELL, quantity) //주식을 파는 빌더 만들기
}
public MethodChainingOrderBuilder addTrade(Trade trade) {
order.addTrade(trade) // 주문에 주식 추가
return this; // 유연하게 추가 주문할 수 있게 주문 빌더 자체를 반환
}
public Order end() {
return order;// 주문 만들기 종료하고 반환
}
}
public class TradeBuilder {
private final MethodChainningOrderBuilder builder;
public final Trade trade = new Trade();
private TradeBuilder(MethodChainingOrderBuilder builder,
Trade.Type type, int quantity) P
this.builder = builder;
trade.setType( type );
trade.setQuantity( quantity );
}
public StockBuilder stock(String symbol) {
return new StockBuilder(builder, trade, symbo);
}
}
빌더를 계속 이어가려면 stock클래스의 tradebuilder의 공개 메서드를 이용해서 인스턴스를 만든다.
public class StockBuilder {
private final MethodChaingOrderBuilder builder;
private final Trade trade;
private final Stock stock = new Stock();
private StockBuilder(MethodChainingOrderBuilder builder, Trade trade, String symbol) {
this.builder = builder;
this.trade = trade;
stock.setSymbol(symbol);
}
public TradeBuilderWithStock on(String market) {
stock.setMarket(market);
trade.setStock(stock);
return new TradeBuilderWithStock(builder, trade);
}
}
StockBuilder는 주식의 시장을 지정, 거래에 주식을 추가, 최종 빌더를 반환하는 on메서드를 정의했다.
public class TradeBuilderWithStock {
private final MethodChaingOrderBuilder builder;
private final Trade trade;
public TradeBuilderWithStock(MethodChaingOrderBuilder builder, Trade trade){
this.builder = builder;
this.trade - trade;
}
public MethodChaningOrderBuilder at(double prcice) {
trade.setPrice(price);
return builder.addTrade(trade);
}
}