/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day29] Singleton

วันที่ยี่สิบเก้าของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เราจะมีคุยกันเรื่อง Singleton


Singleton คืออะไร?

ในบางครั้งเรามีความจำเป็นที่จะจำกัดให้คลาสมี instance ได้เพียงตัวเดียว และสามารถเข้าถึง instance ตัวนี้ได้่จากทุกๆ ที่ในโปรแกรม เช่น คลาสสำหรับเก็บข้อมูลขณะ runtime คลาสสำหรับจัดการค่า configuration ต่างๆ เป็นต้น ที่กล่าวมานี้ก็คือคอนเซ็ปต์ของ Singleton

จะสร้าง Singleton class ได้อย่างไร

วิธีหลักๆ ก็มีอยู่ 2 แบบ

  1. สร้างคลาสที่มี Constructor เป็น private แล้วสร้าง method สำหรับใช้ขอ instance ของคลาส วิธีนี้จะทำให้คลาสของเราเป็น Singleton จริงๆ เอาไป new Instance เองไม่ได้

  2. โยน instance ของคลาส ใส่ IoC กำหนดเป็น Singleton แล้วเรียกใช้ ผ่าน IoC แทน วิธีนี้ค่อนข้างง่ายเพราะให้ IoC จัดการหมด เราก็แค่สร้างคลาสอย่างเดียว และถ้าไม่อยากให้เป็น Singleton ก็สร้าง instance ใหม่เองได้

ในบทความนี้จะยกตัวอย่างแค่รูปแบบแรกครับ เพราะ เราอาจจะยังไม่รู้จัก IoC กัน มาดูตัวอย่างในจาวากันดีกว่าครับ

public class Foo {
	private static Foo instance = null;

	private Foo() {}

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

	public void doWork() {
    	// do something
	}
}

ในโค้ดข้างต้นมีการประกาศคลาส Foo ซึ่งมี Constructor เป็น private และภายในคลาสมี static member เป็นชนิดของ Foo ชื่อ instance มี method สำหรับดึง instance ชื่อ getInstance() นี่เป็นรูปแบบปกติในภาษาจาวาครับ เมื่อคลาส Foo เป็น Singleton แล้ว เราสามารถเรียกใช้งานได้โดยสั่ง Foo.getInstance().doWork()

เอา Singleton ไปทำอะไรกันบ้าง

ถ้าแบบบ้านๆ ก็เอาไปใช้เก็บ State ของแอพ เช่น ตอนนี้ user คนไหนเป็นคนใช้งาน เก็บ user preference หรืออื่นๆ ถ้าเป็นหลักการหน่อยก็เอาไปสร้าง Abstract Factory, Builder อะไรพวกนี้ จริงๆ คือเอาไปใช้กับอะไรก็ได้ที่ต้องมีแค่ชิ้นเดียวในแอพ

Singleton มีข้อเสียไหม

แน่นอนว่าทุกอย่างที่มีข้อดีก็มีข้อเสียด้วย Singleton ก็เช่นกัน เท่าที่นึกออกก็คือมันทำให้เกิดการ coupling ระหว่างคลาสมากขึ้น และก็ดีบัคยากขึ้นนั่นเอง แต่จริงๆ ถ้าเรารู้ว่าเรากำลังทำอะไรอยู่ ใช้งานอย่างมีสติ ข้อดีมันก็มีเยอะกว่า

‪#‎day29 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...