วัตถุประสงค์ของการเขียนโปรแกรมในรูปแบบ builder คือเพื่อรองรับการสร้างออบเจกต์ที่ต้องการองค์ประกอบของพารามิเตอร์ที่แตกต่างกัน โดยปรกติเราสร้างออบเจกต์ด้วยการเรียกใช้เมธอดคอนสตรัคเตอร์และส่งผ่านพารามิเตอร์ตามที่เมธอดคอนสตรัคเตอร์ต้องการ ในกรณีที่การใช้งานก่อให้เกิดการส่งพารามิเตอร์หลากหลายแบบ เราจะต้องสร้างเมธอดคอนสตรัคเตอร์เพิ่มขึ้นมาเพื่อรองรับ สุดท้ายเราจะมีเมธอดคอนสตรัคเตอร์จำนวนมาก เราจึงใช้การเขียนโปรแกรมในรูปแบบ builder เพื่อรองรับความต้องการแบบนี้
วิธีการคือคลาสที่เราสร้างจะมีคลาสที่เป็น builder อยู่ข้างในซึ่งจะคอยจัดการพารามิเตอร์และสร้างออบเจกต์ตามพารามิเตอร์ที่ส่งมา จากตัวอย่างด้านล่างเป็นการสั่งพิซซ่าที่มีส่วนประกอบแตกต่างกัน
class Pizza { // ประกาศคลาส Pizza
private String chicken; //กำหนดฟิลด์เป็นแบบ private เพื่อใช้งานผ่านตัว builder
private String beef;
private String originalSauce;
private String seafoodSauce;
private Pizza(String chicken, String beef,
String originalSauce, String seafoodSauce) {
// สังเกตุว่าเราจะมีเพียงคอนสตรัตเตอร์เดียวเท่านั้น และกำหนดเป็นแบบ private เพื่อใช้งานผ่านตัว builder
this.chicken = chicken;
this.beef = beef;
this.originalSauce = originalSauce;
this.seafoodSauce = seafoodSauce;
}
@Override
public String toString() { // เอาไว้แสดงผล
String str = "Your pizza have";
if (chicken != null) {
str += " "+chicken;
}
if (beef != null) {
str += " "+beef;
}
if (originalSauce != null) {
str += " "+originalSauce;
}
if (seafoodSauce != null) {
str += " "+seafoodSauce;
}
str +=".";
return str;
}
static class Builder {
//สร้างตัว builder ซึ่งจะมีพารามิเตอร์แบบเดียวกับคลาส Pizza
//เพื่อให้ตัว builder ช่วยจัดการเรื่องการพารามิเตอร์ให้กับมเธอดคอนสตรัคเตอร์
private String chicken; //กำหนดฟิลด์เป็นแบบ private เพื่อใช้งานเมธอดเท่านั้น
private String beef;
private String originalSauce;
private String seafoodSauce;
Builder() {}
Builder setChicken(String chicken) {
this.chicken = chicken;
return this;
}
Builder setBeef(String beef) {
this.beef = beef;
return this;
}
Builder setOriginalSauce(String originalSauce) {
this.originalSauce = originalSauce;
return this;
}
Builder setSeafoodSauce(String seafoodSauce) {
this.seafoodSauce = seafoodSauce;
return this;
}
Pizza build() {
// เรียกใช้ builder ซึ่งจะไปเรียกเมธอดคอนสตรัคเตอร์อีกทีหนึ่ง โดยตัว builder จะจัดการ
// พารามิเตอร์ให้ หากพารามิเตอร์ใดไม่มีก็จะส่งเป็น null เราจึงใช้เพียงเมธอดคอนสตรัคเตอร์เดียวได้
return new Pizza(chicken, beef, originalSauce, seafoodSauce);
}
}
}
ในการเรียกใช้งาน เราจะสร้างออบเจกต์ผ่านตัว builder และกำหนดเฉพาะพารามิเตอร์ที่ต้องการดังตัวอย่างด้านล่าง
package com.company;
public class Main {
public static void main(String[] args) {
Pizza chickenPizza = new Pizza.Builder()
.setChicken("chicken")
.setOriginalSauce("original sauce")
.build();
System.out.println(chickenPizza);
Pizza beefSeafoodSauce = new Pizza.Builder()
.setBeef("beef")
.setSeafoodSauce("seafood sauce")
.build();
System.out.println(beefSeafoodSauce);
}
}
จากผลลัพธ์จะเห็นว่าเราได้พิซซ่าที่แตกต่างกันตามพารามิเตอร์ที่เลือก
Your pizza have chicken original sauce. Your pizza have beef seafood sauce.