[Algorithm] Singleton Design Pattern

วันนี้เราจะมาสอน Design Pattern อีกตัวนึงคือ Singleton  ซึ่ง Pattern ในหมวดของ creational และเป็นตัวสุดท้ายที่ผมจะสอนในหมวดนี้ครับ ซึ่งในโลกนี้หากเรียบเทียบมันจะเหมือนกับคำว่า “เป็นเอกลักษณ์ (unique)” ซึ่งผมคงไม่ต้องธิบายว่ามันคืออะไร

ในการใช้ Singleton นั้น จะมีคำจำกัดความอยู่สองแบบคือ

Ensure a class has only one instance, and provide a global point of access to it.

Encapsulated “just-in-time initialization” or “initialization on first use”.

ซึ่งจะหมายถึงการตรวจสอบ Class เพื่อให้แน่ใจว่า Class นั้นมี Object ที่ขึ้นตรงต่อ Class เพียงหนึ่งเดียวนั้นเท่านั้น และสิทธิ์ในการเข้าถึงได้ ส่วนอีกความหมายคือเป็นการทำ  Encapsulate แบบ  just-in-time initialization และ initialization on first use ครับผม หรืออาจจะ งง ๆ กันิดหน่อยผมก็ได้ไปหาความหมายมาแล้วสรุปให้ดังนี้ครับ

Singleton pattern เป็น design pattern ที่ใช้จำกัดจำนวน object ที่ถูกสร้างในขณะที่โปรแกรมทำงาน มีประโยชน์ในสถานการณ์ที่ทั้งระบบต้องมี object เพียงตัวเดียวเพื่อจะได้ไม่เกิดการทำงานซ้ำซ้อนกันเช่น class สำหรับ setting ค่าต่าง ๆ

ที่นี่เรามาดูโครงสร้างของ Pattern ผ่าน Class Diagram กันซึ่งจะเขีียนได้ดังนี้

ซึ่งถ้าให้ถึงการทำงานแบบชัดเจนก็ใช้แสดงผ่าน Sequence Diagram  ซึ่งจะแสดงการทำงานของ  Singleton ได้ดังนี้ครับ

โดยเมื่อมองจากตรงนี้เราจะเป็นว่าการเพียงการสร้าง Object จาก Singleton Class และมีฟังก์ชันที่ใช้ในการตรวจสอบคือ  getInstance() เพื่อให้เข้าถึงตัว Class ได้

ที่นี้เรามีดูวิธีเขียนบ้าง

[sourcecode language=”java” wraplines=”false” collapse=”false”]
public class Singleton
{
private Singleton instance;

private Singleton()
{
}

public static Singleton getInstance()
{
if(instance==null)
{
instance = new Singleton();
}
return instance;
}

}
[/sourcecode]

การนำไปใช้

[sourcecode language=”java” wraplines=”false” collapse=”false”]

Singleton singleton1 = Singleton.getInstance();
Singleton singleton2= Singleton.getInstance();

[/sourcecode]

ซึ่งการเรียกใช้ก็เป็รประมาณนี้เพื่อเป็นการตรวจสอบดูว่า singleton1 ถูกส้รางขึ้นมาหรือยัง ถ้ายังก็โยน new Singleton(); ซึ่งเป็น ref ออกมาใช้กับตัวแปร ประโยนช์เพื่อไม่ให้เกิดการซ้ำซ้อนของ Object นั้นเองอย่างเช่น หากว่า singleton1 สร้า้งไปแล้วหากเราทำการสร้างอีกครั่งตัว Objecrt เนี่ยก็จะทำงานซ้อนไปซ้อนมาในระบบทำให้เกิดการผิดพลาดในการประมวลผลได้ เช่นการตั่งค่าโปรแกรมเป็นต้น เราจึงจำเป็นต้องมีตัวตั่งค่าโปรแกรมเพียงตัวเดียวเท่านั้น ไม่ควรมีมากว่่านั้น

ดังนั้นเราดังนั้นเพื่อความปลอดภัยในการเข้าถึงตัว Class และ Object เราจึงต้องทำ ให้ constructor เป็น private หลายๆ คนอาจไม่รู้ว่าทำไม เพื่อป้องการการเข้าถึงแบบ new Class() ซึ่งถ้าเราทำแบบนี้ผู้ใช้งานจะไม่สร้างสามารถสร้าง Object ได้นอกจากจะตรวจสอบกับ Class เท่านั้นครับ เป็นการทำ Encapsulate ไปในตัว ซึ่งหากใครไม่เข้าใจเรื่อง private constructor ผมแนะนำให้ลองไปหาอ่านดู ซึ่งหนังสือที่เขียนไว้ผมก็เอามาอ้างอิงคือ JAVA Programming Volume 1 โดย ดร.วีระศักดิ์ ซึงถาวร ซึ่งในนั้นจะเขียนไว้ครบถ้วน

อ้างอิง: JAVA Programming Volume 1 โดย ดร.วีระศักดิ์ ซึงถาวร , http://java.dzone.com , http://www.oodesign.com

Facebook Comments