Builder Pattern

Builder Pattern เป็น pattern ที่ใช้สำหรับแก้ปัญหาที่เกิดในลักษณะของ Telescoping Constructor Pattern คือ ต้องการสร้าง class ที่มีความหลากหลายของตัวเลือก และ parameter ของ Constructor หรือ Method มีจำนวนมาก ซึ่งจะทำให้ยากต่อการตีความของ parameter แต่ละตัว ผมขอยก Class ที่ใช้อธิบายในบทความ Telescoping Constructor Pattern มาทำเป็น Builder Pattern เพื่อให้ง่ายต่อการเปรียบเทียบลักษณะของปัญหาและรูปแบบการใช้งาน

public class Vegetable {
	// amount of vitamin in vegetable (mg)
	private final int c;
	private final int a;
	private final int b1;
	private final int b6;
	private final int b12;
	private final int d;

	public static class Builder {

		// require
		private final int c;

		// option
		private int a;
		private int b1;
		private int b6;
		private int b12;
		private int d;

		public Builder(int c) {
			this.c = c;
		}

		public Builder a(int a) {
			this.a = a;
			return this;
		}

		public Builder b1(int b1) {
			this.b1 = b1;
			return this;
		}

		public Builder b6(int b6) {
			this.b6 = b6;
			return this;
		}

		public Builder b12(int b12) {
			this.b12 = b12;
			return this;
		}

		public Builder d(int d) {
			this.d = d;
			return this;
		}

		public Vegetable build() {
			return new Vegetable(this);
		}
	}

	private Vegetable(Builder builder) {
		this.c = builder.c;
		this.a = builder.a;
		this.b1 = builder.b1;
		this.b6 = builder.b6;
		this.b12 = builder.b12;
		this.d = builder.d;
	}

	public static void main(String[] args) {
		Vegetable tomato = new Vegetable.Builder(10).build();
		Vegetable kale = new Vegetable.Builder(5).a(8).b1(1).b6(0).b12(6).d(3).build();
	}
}

จากโค๊ดตัวอย่างผมได้ทำการสร้าง static nested class ไว้ใน class Vegetable ชื่อว่า Builder ซึ่ง class นี้จะทำหน้าที่รวบรวม property ที่เราสนใจ นั้นก็คือ vitamin นั้นเอง และ method สุดท้ายของ class Builder จะเป็นการสร้าง class Vegetable โดยส่วนนี้จะทำงานคู่กับ private constructor ของ Class Vegetable

		//method ในคลาส Builder สำหรับสร้าง SuperClass
		public Vegetable build() {
			return new Vegetable(this);
		}
...
...
...
	//private constructor เพื่อให้ inner class เรียกใช้งาน
	private Vegetable(Builder builder) {
		this.c = builder.c;
		this.a = builder.a;
		this.b1 = builder.b1;
		this.b6 = builder.b6;
		this.b12 = builder.b12;
		this.d = builder.d;
	}

เมื่อเราสร้าง Builder class แล้วประเราสามารถเรียกใช้งานโดยการ new ผ่าน superclass

	public static void main(String[] args) {
		Vegetable tomato = new Vegetable.Builder(10).build();
		Vegetable kale = new Vegetable.Builder(5).a(8).b1(1).b6(0).b12(6).d(3).build();
	}

จะเห็นว่าค่าทุกค่าที่เราใส่เข้าไปเราจะใช้ผ่าน method เฉพาะของมันทำให้เราเข้าใจได้ทันทีว่าเรา set ค่าอะไรไปเท่าไหร่และเมือเรา set ค่าเรียบร้อยแล้วเราก็จะจบด้วย method build เพื่อสร้าง class Vegetable ขึ้นมา

การใช้งาน Builder pattern สามารถนำไปใช้กับ abstract factory pattern ได้ เพื่อสร้างความยีดหยุ่นให้กับคลาสโดยผมจะขอยกตัวอย่างการใช้ abstract factory pattern ร่วมกับ builder pattern ในบทความต่อไปครับ

Ref. Prentice Hall – Effective Java (P.13-16)



me on google plus+Jirawong Wongdokpuang

Telescoping Constructor Pattern


Telescoping Constructor [ Effective Java,p. 11 ] เป็นการสร้าง Constructor เพื่อรองรับรับ property ที่มีจำนวนมากและรูปแบบการสร้างที่หลากหลาย ตัวอย่างโค๊ดที่ผมจะแสดงให้ดู เป็นคลาสของ Vegetables ซึ่งมี Property เป็น vitamin โดยผมกำหนดให้ต้องใส่ vitamin C เป็นอย่างน้อย ลองดูตัวอย่างโค๊ดด้านล่างครับ
Continue reading