[Algorithm] Builder Pattern

สวัสดีครับ บทความตัวนี้ก็เป็นภาคต่อของ Telescoping Constructor Pattern ซึ่งก็ยังอยุ่ในบทเรียนของหนังสือ Effective Java” และตัวนี้ก็เป็นตัวที่เอา Telescoping Constructor Pattern มาทำการ impove ให้มันมีประสิทธิภาพและอ่านง่าย และสำหรับคำอธิบายผมแนะนำให้ไปอ่าน Telescoping Constructor Pattern ก่อนนะครับผมไม่เขียนเกียจเขียนซ้ำ 5 5 5 แต่เหตุที่ทำ Builder เนี่ยคือ Telescoping  ไม่มีตัวบอกว่าเราเวตพารามิเตอร์ตัวไหน คนอื่านจะไม่รู้เรื่อง แต่ถ้า ตัวนี้จะมีการเอาเรื่องของ Inner Class เข้ามาช่วยและทำการสร้าง Service Method ที่มี Return Type เดียวกันกับ Inner class และจะเรียกใช้ได้ง่ายและเห็นภาพมากกว่าครับ

[sourcecode language=”java” wraplines=”false” collapse=”false”]
// Builder Pattern
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;

public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters – initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val){
calories = val; return this;
}
public Builder fat(int val){
fat = val; return this;
}
public Builder carbohydrate(int val){
carbohydrate = val; return this;
}
public Builder sodium(int val){
sodium = val; return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}

private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
[/sourcecode]

วิธีการเรียกใช้ก็ประมาณนี้ครับผม หลังจากที่เราใส่พารามิเตอร์ลงไปหมดแล้วก็ใช้ build() ทำการสร้างข้อมูลใส่ไปในตัวแปรของเรา ปกติแล้วเราจะมีพารามิเตอร์ตัวหลักที่ต้องกำหนด และมีตัวที่เป็น option ไว้ในตัวอย่างตัวหลักที่ต้องมีก็คือ servingSize, servings ที่เหลือก็ นption จะใส่ไม่ก้แล้วแต่แนวคิดก็ประมาณนี้

[sourcecode language=”java” wraplines=”false” collapse=”false”]
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).sodium(35).carbohydrate(27).build();
[/sourcecode]

credit: Effective Java (2nd Edition) by Joshua Bloch

Facebook Comments