ดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งานดาวไม่ได้ใช้งาน
 

Singleton Pattern

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

     เปรียบเสมือนว่าห้อง คือ Application ของเรา และกระดานก็คือ Model นั่นเอง เพราะ Singleton คือ สิ่งของที่มีชิ้นเดียวในโลกถ้าไม่มีก็ทำให้การสร้างขึ้นมา แต่ถ้าหากมีแล้วก็ใช้ซ้ำ นั่นเอง

โครงสร้างโค้ดที่เป็นแบบ Singleton (Java) หน้าตาก็จะเป็นปะมาณนี้

     จากโค้ดตัวอย่างด้านบน มีตัวแปรที่มีชื่อว่า instance โดยมี type เป็น Object ที่ชื่อว่า Singleton ซึ่งเป็นตัวแปรแบบ static และมีการเข้าถึงเป็นแบบ private จึงต้องทำการสร้าง method ที่ชื่อว่า getInstance() เพื่อให้ทำการเข้าถึงตัวแปรที่ชื่อว่า instance นั่นเอง

     ซึ่งการทำงานของ method getInstance() คือเมื่อมีการเรียกใช้ก็จะเช็คว่าตัวแปร instance นั้นมีค่าเท่ากับ null รึเปล่า ซึ่งครั้งแรกยังไงมันก็ null อะเนาะ และถ้าหากใช่ก็จะทำการกำหนดค่าให้กับตัวแปรโดยจะทำการสร้าง Object ที่ชื่อว่า Singleton ขึ้นมา แต่ถ้าไม่ก็จะทำการ return ตัวแปร instance ออกไป และเนื่องจากว่าตัวแปร instance เป็นแบบ static หมายความว่าจะไม่โดนทำลายทิ้ง พอมีการเรียกใช้ method getInstance() อีกครั้ง ตัวแปร instance ก็จะไม่มีค่าเป็น null ทำให้ไม่ต้องทำการสร้าง Object ขึ้นมาใหม่

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

public static void main(String[] args) {
    Singleton singleton = Singleton.getInstance();
}

     จากโค้ดตัวอย่างด้านบน มีตัวแปรที่มีชื่อว่า instance โดยมี type เป็น Object ที่ชื่อว่า Singleton ซึ่งเป็นตัวแปรแบบ static และมีการเข้าถึงเป็นแบบ private จึงต้องทำการสร้าง method ที่ชื่อว่า getInstance() เพื่อให้ทำการเข้าถึงตัวแปรที่ชื่อว่า instance นั่นเอง

   ตัวอย่างการใช้งาน Singleton

public class UserData {

    private String fistName;
    private String lastName;

    private static UserData instance;

    private UserData() {

    }

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

    public String getFistName() {
        return fistName;
    }

    public void setFistName(String fistName) {
        this.fistName = fistName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

- Constructor จะเป็น private เนื่องจากไม่ต้องการให้ผู้ใช้งานสร้าง instance ได้
- มี static method ชื่อว่า instance เอาไว้สำหรับให้ผู้ใช้งาน เพื่อทำให้มั่นใจว่าจะมีเพียง instance เดียวเท่านั้น

    การนำเอา Singleton Pattern เข้ามาใช้งานก็เหมือนจะเป็นสิ่งที่ถูกต้อง เพราะ ซิงเกิลตันแพตเทิร์นถูกสร้างโดยเขียนคลาสให้ซ่อนคอนสทรัคเตอร์ทั้งหมดไว้จากคลาสอื่นๆ คือให้คอนสทรัคเตอร์เป็นไพรเวท จากนั้นสร้างเมธอดมีหน้าที่สร้างอ็อบเจกต์ของคลาสนี้ถ้ายังไม่ถูกสร้างและเก็บอ็อบเจกต์ตัวที่ถูกสร้างใหม่นี้ไว้ จากนั้นส่งคืนอ็อบเจกต์เพียงตัวเดียวนั้นให้ทุกครั้งที่มีการร้องขออ็อบเจกต์ของคลาส ไม่จำเป็นต้องมาสร้าง Object ใหม่ทุกครั้งตอนเรียกใช้งาน เช่น พวก Manager หรือ Utility แต่ถ้าหากไม่เข้าใจมันอย่างลึกซึ้งก็อาจจะกลายเป็นสิ่งที่น่ากลัว เนื่องจาก Singleton ก็ถือว่าเป็นตัวแปร Static ที่ล่องลอยอยู่ในระบบ ถ้าหากเอามาใช้ในการเก็บข้อมูลที่มีขาดใหญ่ Memory ก็ถูกกินไปตามขนาดของข้อมูล ซึ่งถ้าหากไม่มีการจัดการที่ดีก็ทำให้เกิดผลเสียได้ ข้อควรระวังสำหรับการใช้ซิงเกิลตันแพตเทิร์นในโปรแกรมที่ทำงานแบบ multi-threading คือหลายส่วนของโปรแกรมอาจจะพยายามเรียกเมธอดให้สร้างอ็อบเจกต์เป็นครั้งแรกในเวลาเดียวกัน อาจทำให้มีการสร้างอ็อบเจกต์ขึ้นมาเกินหนึ่งตัวได้ ในกรณีนี้ควรป้องกันโดยอนุญาตให้เพียงหนึ่งเทร็ดเรียกเมธอดได้ในขณะใดขณะหนึ่ง (mutually exclusive)

อ้างอิงข้อมูลและโค้ดตัวอย่างจาก 

 Singleton Pattern .[ออนไลน์].เข้าถึงได้จาก : https://www.goragod.com/knowledge/singleton_pattern.html .[16.3.2020]

Singleton Pattern คืออะไร?.[ออนไลน์].เข้าถึงได้จาก : https://medium.com/20scoops-cnx/singleton-pattern-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-b7b28182654f .[16.3.2020]

ซิงเกิลตันแพตเทิร์น .[ออนไลน์].เข้าถึงได้จาก : https://th.wikipedia.org/wiki/%E0%B8%8B%E0%B8%B4%E0%B8%87%E0%B9%80%E0%B8%81%E0%B8%B4%E0%B8%A5%E0%B8%95%E0%B8%B1%E0%B8%99%E0%B9%81%E0%B8%9E%E0%B8%95%E0%B9%80%E0%B8%97%E0%B8%B4%E0%B8%A3%E0%B9%8C%E0%B8%99 .[16.3.2020]

ว่าด้วยเรื่องของ Singleton pattern ควรเข้าใจก่อนนำมาใช้งาน .[ออนไลน์].เข้าถึงได้จาก : http://www.somkiat.cc/singleton-pattern/ .[16.3.2020]

Singleton design pattern in Java .[ออนไลน์].เข้าถึงได้จาก : https://www.javatpoint.com/singleton-design-pattern-in-java .[16.3.2020]

กระทู้ล่าสุดจากเว็บบอร์ด
หัวข้อกระทู้
ตอบ
เปิดดู
ล่าสุด
เครื่องมือช่วยกรองสินค้า สำหรับค้นหาสินค้าที่ต้องการ
โดย prmindphp พฤ 02 เม.ย. 2020 6:46 pm บอร์ด MindPHP News & Feedback
0
11
พฤ 02 เม.ย. 2020 6:46 pm โดย prmindphp
การเขียน Script สำหรับสร้าง User ใน Joomla
โดย tsukasaz พฤ 02 เม.ย. 2020 3:33 pm บอร์ด Joomla Developing Knowledge
0
32
พฤ 02 เม.ย. 2020 3:33 pm โดย tsukasaz
อยากทราบวิธีการดึงข้อมูลจาก Excel โดยการดึงข้อมูลจาก คอลัมของ Excel มาบันทึกลงในฐานข้อมูล
โดย Ittichai_chupol พฤ 02 เม.ย. 2020 10:09 am บอร์ด Programming - PHP
1
20
พฤ 02 เม.ย. 2020 10:43 am โดย mindphp
เอ้าๆ ใครที่ใบขับขี่หมดอายุในช่วง COVID-19 สามารถอมรมผ่านออนไลน์ ด้วย e-learning ได้เเล้วนะ
โดย thatsawan พฤ 02 เม.ย. 2020 10:09 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
14
พฤ 02 เม.ย. 2020 10:09 am โดย thatsawan
วิธีการเชื่อม api ของ gitlab สำหรับดาวน์โหลดไฟล์ project ใน ภาษา Python
โดย jirawoot พ 01 เม.ย. 2020 3:38 pm บอร์ด Python Knowledge
0
61
พ 01 เม.ย. 2020 3:38 pm โดย jirawoot
สอบถาม ผมจะทำ ci ของ gitlab ผมดูดไฟล์ project จาก api ของ gitlab ได้แล้วทำอย่างไรต่อครับ
โดย jirawoot พ 01 เม.ย. 2020 12:09 pm บอร์ด Programming - C/C++ & java & Python
3
40
พฤ 02 เม.ย. 2020 10:50 am โดย tsukasaz
ผมอัพเกรด joomla 2.5 เป็นเวอร์ชั่นล่าสุด 3.8 หน้าเว็บเวอร์ชั่นเดิมจะหายไปไหมคับ
โดย Anonymous พ 01 เม.ย. 2020 12:00 pm บอร์ด ปัญหาการใช้ phpBB3, SMF, Joomla, Wordpress, CMS, CRM
3
37
พ 01 เม.ย. 2020 4:29 pm โดย icphp
ลดอัตราหัก ณ ที่จ่าย เหลือ 1.5% ออกเป็นกฎหมายมีผลใช้บังคับแล้ว!!! นะ เริ่ม 1 เมษายน 2563
โดย thatsawan พ 01 เม.ย. 2020 10:54 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
58
พ 01 เม.ย. 2020 10:54 am โดย thatsawan
วิธีการจัดการกับเด็กๆ กวนใจ เมื่อต้องทำงานจากบ้าน #Work from home
โดย thatsawan พ 01 เม.ย. 2020 9:53 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
25
พ 01 เม.ย. 2020 9:53 am โดย thatsawan
วิธีแก้ไขปัญหา สำหรับ การนำ Template phpbb 3.3 มาใช้ใน phpbb 3.2
โดย thatsawan อ 31 มี.ค. 2020 7:27 pm บอร์ด phpBB user Guide Knowledge
0
60
อ 31 มี.ค. 2020 7:27 pm โดย thatsawan
สอบถาม ผมลองใช้ curl ของ API ของ gitlab แล้ว "message":"401 Unauthorized ครับ
โดย jirawoot อ 31 มี.ค. 2020 5:16 pm บอร์ด Programming - C/C++ & java & Python
1
101
อ 31 มี.ค. 2020 5:35 pm โดย jirawoot
การเชื่อมต่อ API ของ GitLab เพื่อดาวน์โหลดไฟล์
โดย tsukasaz อ 31 มี.ค. 2020 12:52 pm บอร์ด PHP Knowledge
0
727
อ 31 มี.ค. 2020 12:52 pm โดย tsukasaz
วิธิการใส่ icon favorite เพื่อแสดงในแต่ละ browser
โดย Ittichai_chupol อ 31 มี.ค. 2020 11:14 am บอร์ด Graphic design
4
121
พฤ 02 เม.ย. 2020 4:33 pm โดย thatsawan
สิ่งที่เกิดขึ้นจริงในการประชุมด้วยเทคโนโลยี Conference Call #Work from home
โดย thatsawan อ 31 มี.ค. 2020 10:39 am บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
34
อ 31 มี.ค. 2020 10:39 am โดย thatsawan
ช่วงนี้ Work From Home ก็จะลำบากนิดนึงแหละเนอะ #ทาสเเมว
โดย thatsawan จ 30 มี.ค. 2020 2:29 pm บอร์ด พูดคุยเรื่องทั่วไป จับฉ่าย
0
74
จ 30 มี.ค. 2020 2:29 pm โดย thatsawan
อยากทราบวิธีสร้างเว็บหน้าเดียวแบบกรอกข้อมูลเสร็จแล้วประมวลผล
โดย phongkhukhan ส 28 มี.ค. 2020 1:00 am บอร์ด ปัญหาการใช้ phpBB3, SMF, Joomla, Wordpress, CMS, CRM
2
299
ส 28 มี.ค. 2020 1:09 am โดย mindphp
แสดงสินค้าที่อยากได้ใน Wishlist ด้วย Module Wishlist
โดย prmindphp ศ 27 มี.ค. 2020 5:26 pm บอร์ด MindPHP News & Feedback
0
135
ศ 27 มี.ค. 2020 5:26 pm โดย prmindphp
ต้องการสร้าง subtype
โดย blackbullx16 ศ 27 มี.ค. 2020 4:15 pm บอร์ด SQL - Database
0
276
ศ 27 มี.ค. 2020 4:15 pm โดย blackbullx16
อยากทราบวิธีการใช้งาน อีเวน cron ว่ามีการใช้งานอย่างไครับ
โดย Ittichai_chupol ศ 27 มี.ค. 2020 11:10 am บอร์ด Programming - PHP
2
172
ศ 03 เม.ย. 2020 10:37 am โดย Ittichai_chupol
อยากทราบวิธีการแก้ไขการแปลงปีวันที่ใน phpbb ผิด เมื่อกรอกวันที่ 29/02
โดย Ittichai_chupol ศ 27 มี.ค. 2020 10:42 am บอร์ด Programming - PHP
3
149
จ 30 มี.ค. 2020 7:01 pm โดย mindphp