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

Advertisements

Hot Deploy on Jboss

พอดีได้มีโอกาสลองใช้งาน jboss ในการ run project เล็กๆอันหนึ่งก็พบว่าเวลาแก้ไขไฟล์แล้วมันไม่ update ข้อมูลใหม่ให้ต้อง restart server ทุกครั้งเพื่อดูผลที่เปลี่ยนแปลง ก็เลยเปิด admin console ของ jboss ดูพบว่า jboss สามารถทำ hot deploy ได้โดยการตั้งค่า deployment scanners ซึ่งวิธีการตั้งค่านั้นแสนง่ายเหลือหลาย

โดยเข้าไปหน้า admin console (ex. localhost:9990) ไปที่

Profile -> core -> deployment scanners

จากนั้นคลิก edit ทีหนึ่งเพื่อแก้ไขค่า config

ติ๊กถูกที่ Auto-deploy exploded แล้วกด Save เพียงเท่านี้เวลาเราแก้ไขไฟล์แล้ว refresh หน้าเว็บมันก็จะอับเดทให้ใหม่แล้วครับ

Screen Shot 2555-12-10 at 3.11.03 AM



me on google plus+Jirawong Wongdokpuang

Java Initializer Block

Initializer Block เป็นการเขียน Block ของโค๊ดขึ้นมาธรรมดาทั่วไป และไม่มี state หรือ behavier ใดๆมานำหน้า แต่หากหากความสามารถนั้นไม่ธรรมดา การสร้าง Initializer Block นั้นจะมีอยู่สองแบบ คือ

Static Initializer Block ซึ่งมีลักษณะการเขียนเป็น

public class SomeClass{
	static{
		//Code
	}
}

static initializer block เป็น initializer block ที่ใช้สำหรับ static context

Initializer Block(ไม่มี static นำหน้า) ซึ่งมีลักษณะการเขียนเป็น

public class SomeClass{
	{
		//Code
	}
}

ความสามารถของ initializer block คือการ initial ค่าต่างๆให้กับ Constructor ได้เพราะว่ามันจะถูกเรียกก่อน Constructor ซึ่งมักนิยมใช้ share การทำงานที่ซ้ำซ้อนเมื่อ Class นั้นมีหลาย Constructor

ตัวอย่างโค๊ดที่แสดงด้านล่างเป็นตัวอย่างในการ initial ค่่าให้กับ Constructor

public class A {

    private static int initialValue;
    private int count;

    public A() {
        System.out.println("Number Of New Class A : " + count);
    }
    
    public A(int plus) {
        System.out.println("Number Of New Class A : " + (count+plus));
    }

    static {
        initialValue = 0;
    }

    {
        count = ++initialValue;
    }

    public int getCount() {
        return count;
    }
}
public class B {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new A();
        A a3 = new A(10);
        A a4 = new A(20);
    }
}

ผลลัพธ์ที่ได้จากการ run Class B คือ

Number Of New Class A : 1
Number Of New Class A : 2
Number Of New Class A : 13
Number Of New Class A : 24


me on google plus+Jirawong Wongdokpuang

สร้าง Wireless Access Point บน Windows

หลายๆคนอาจไม่ทราบว่า Windows มี feature ในการสร้าง Wireless Access Point มาให้ด้วยในตัวโดยเราไม่ต้องซื้ออุปกรณ์เพิ่มเติมหากเครื่องเรามี Wireless อยู่แล้ว (Notebook,netbook ปัจจุบันคงมีกันทุกเครื่องแล้ว) โดย feature นี้จะเป็นการสร้าง Microsoft Hosted Network Virtual Adapter ขึ้นมา

Continue reading

JMS Tutorial

Installation

Basic Send Receive

Tip



me on google plus+Jirawong Wongdokpuang

Easy Jms Receiver

หลังจากที่เราได้ทำการส่ง Jms Message จากบทความ Easy Jms Sender แล้วเราจะมาทำตัว Receiver กันบ้างครับ โดยลักษณะก็จะคลายกับตัวส่งครับ คือสร้าง Queue Connection ขึ้นมา สร้าง Session และ สร้าง Queue เมื่อเราได้ทั้งสามตัวนี้เราก็จะสามารถสร้าง Queue Receiver ได้ครับ ในบทความนี้ผมของเปลี่ยนแปลงนิดหนึ่งคือผมจะใช้ Maven เข้ามาช่วย ซึ่งจะทำให้การทำงานของเราง่ายขึ้นครับ

Continue reading

Easy Jms Sender

เมื่อเราได้ทำการติดตั้ง JMS Broker แล้วเรามาลองส่ง JMS กันดูครับ โดยผมจะใช้ JMS Broker ที่ได้ทำการติดตั้งในบทความ Install OpenMQ on Solaris เป็น Message Server และใช้ Netbeans 7.2 เป็น Editor นะครับ โดยผมจะขออธิบายการทำงานของ jms คร่าวๆก่อนนะครับ jms นั้นจะประกอบด้วย Queue Connection Factory ซึ่งเป็นตัวสร้าง Queue โดย Queue นั้นจะเป็นตัวอ้างถึงเมื่อเราต้องการส่ง Message เช่น Queue Connection Factory ทำการสร้าง Queue ชื่อ MyQueue เมื่อเราจะทำการส่ง Message เราจะทำการส่งให้ MyQueue แล้วเมื่อเรารับ Message เราก็เรียก MyQueue เพื่อรับ Message ทีนี้เรามาลองเขียน การส่ง Jms ดูครับ

Continue reading