[Design Pattern]Singleton

พูดคุย, แนะนำเกร็ดความรู้สาระทั่วไป

Moderator: nat3

[Design Pattern]Singleton

Postby nat3 » Sun Jun 10, 2007 10:01 pm

เห้อ บอร์ดนี้ช่างเงียบดีเจงๆมีคนเล่นอยู่คนเดียว ช่างมันไว้เป็นที่ฝากเรื่องปวดหัวละกัน

Singleton คือ design pattern แบบนึง จบ :twisted:
ขี้เกียจอธิบายยาว เพราะใช้เป็นอย่างเดียว 555 ไปดูรูปแบบมันจาก code ดีกว่า

Code: Select all
class Bank {
  private static Bank bank;

  private Bank() {...};

  public static Bank getInstance() {
    if (bank != NULL)
      return bank;
    else {
      bank = new Bank();
    }
  }
 
  public void deposit() {...}
  public void withdraw() {...}
  public ...
}

จาก code ด้านบนจะเห็นว่า คลาส Bank สามารถสร้างออกมาได้ทางเดียวคือจาก method getInstance โดย method นี้จะมีการตรวจสอบว่าเคยมีการสร้าง instance ไว้หรือยัง ถ้าหากสร้างไว้แล้วก็เอา instance เดิมคืนให้เลย แต่ถ้ายังไม่สร้างก็จะสร้างให้ใหม่ การทำแบบนี้ทำให้จะเรียกกี่ครั้งในระบบก็จะมี Bank อยู่ Bank เดียว

ประโยชน์ของมันต้องลองเปรียบเทียบกับด้านล่างดู หากไม่ใช้ singleton
Code: Select all
class Bank {
  public static void deposit() {...}
  public static void withdraw() {...}
  public static ...
}

class ABank extend Bank {
  ...
}

class Main {
  public static void main(String args[]) {
    ABank a = new Abank();
    ABank.deposit(); //? เอ๊ ยังสามารถเรียก method เดิมของ Bank ได้อยู่เลย
  }
}


จาก code จะเห็นว่าหากไม่ใช้ singleton ยังสามารถใช้ static method ได้ แต่ถ้าหากคลาสนั้นมีการ inherit ขึ้นมา method ที่มีการทำงานของ Bank เดิมแล้วอยากจะซ่อนไว้ก็ยังสามารถเรียกใช้ได้อยู่

สำหรับ singleton ก็มีแค่นี้แหละ ว่าแต่ที่มหา'ลัย มีสอนพวก design pattern บ้างหรือยังเนี๊ยะ
User avatar
nat3
Moderators
 
Posts: 1229
Joined: Mon Jun 13, 2005 12:52 pm

Postby nat3 » Mon Jun 11, 2007 8:11 pm

:cry: บอร์ดนี้มันเงียบเหงาเจงๆ ไม่มีแม้แต่คนมา comment เลยแฮะ
งอนไม่มาโพสท์แล้วดีกว่า :cry:
User avatar
nat3
Moderators
 
Posts: 1229
Joined: Mon Jun 13, 2005 12:52 pm

Postby Poron » Mon Jun 11, 2007 8:42 pm

โอ้โห มันมหัศจรรย์ขนาดนั้นเลยหรอคับ

ถ้ารู้ว่าทำอย่างนี้ได้ ตอนนั้น(ตอนไหนหว่า) คงทุ่นแรงไปเยอะเลยนะเนี่ย
บิ๊กกี้คุง #21
see me @ BiggyClub

Image
User avatar
Poron
Member
 
Posts: 609
Joined: Sun May 28, 2006 2:17 am
Location: http://biggyclub.co.cc

Postby Inception » Mon Jun 11, 2007 10:28 pm

ก็อ่านเรื่อยๆอ่าพี่ ก็เพราะเห็นว่าพี่ชอบเอาเรื่องดีๆมาให้ ถึงให้พี่เป็นmod ห้องนี้อ่ะ
Bak #19
รักภาค รักน้อง ก็ต้องรักให้ถูกทาง
อย่าทำอะไรผิดๆ จนเคยชิน และคิดว่าเป็นเรื่องปรกติ

www.ummata.net
User avatar
Inception
Senior Admin
 
Posts: 2780
Joined: Wed Jun 01, 2005 12:50 am

Postby nat3 » Tue Jun 12, 2007 7:12 pm

กำลังคิดว่าจะเลิกโพสท์ที่บอร์ดนี้ไปโพสท์ที่ Free style แทนง่ะ พอตกค่อยย้ายมาเก็บ
ไม่ได้เลิกโพสท์ไปเลยหรอก

โพสท์ในนี้มันเหมือนคุยคนเดียวมาก วังเวงชอบกล คุยไปไม่มีคนตอบเลย
User avatar
nat3
Moderators
 
Posts: 1229
Joined: Mon Jun 13, 2005 12:52 pm

Postby SoUL » Thu Jun 21, 2007 8:14 pm

ตัว singleton pattern ตัวอย่างของการนำมาใช่จริงก็อย่างเช่น pooling cache และอื่นๆว่าแต่ไม่ค่อย

มีคนสนใจเลยหรอสำคัญนะ :( :(

concept ของ Pattern นี้ก็คือเราต้องการใช่ Object ที่มี state ที่เหมือนเดิมไม่เปลี่ยนแปลง
ทำให้เมื่อเวลาที่เราสร้าง Object จาก Pattern นี้จึงต้องทำอย่าง code นี้

Class Singleton {
private static Singleton singleton;

static {
singleton = new singleton();
}

public static Singleton getInstance() {
return singleton;
}

}

Pattern นี้ ตัว Object ที่เก็บไว้ใน Object singleton ไม่จำเป็นต้องมีแค่ Object เดียวนะครับ
อาจจะมีหลาย Object ได้เหมือนกันแต่ต้อง manage ดีๆหน่อยแล้วก็อีกอย่างถ้าเอา Pattern
นี้ไปใช่ในโปรแกรมที่มีหลาย Thread ต้องระวังพวกเรื่อง Dead lock และอื่นๆจำไม่ค่อยได้
วิธีแก้ก็ใช่พวก sychronized sychronized คือ เมื่อเราประกาศให้ Function หรือตัวแปรนั้น
เป็น sychronized แล้วจะทำให้ Function หรือตัวแปรนั้นจะมี thread มา access ได้แค่ที่ละ
thread เท่านั้น

ถูกหรือเปล่าหว่าถ้าผิดก็มีคนมาช่วยด้วยก็ดีนะ
ทำไมเรามานแก่ลงทุกวันเลย - -"
จะมีใครใคร ร๊ากกกคนหน้าตาอย่างช้านนนนนน
Image
User avatar
SoUL
Member
 
Posts: 977
Joined: Mon Jun 13, 2005 5:16 pm
Location: ที่ไหนสักที่

Postby Spadez » Sun Jun 24, 2007 9:46 pm

singleton pattern นั้นใช้สำหรับเก็บ state ณ เวลานั้นๆให้ class อื่นๆสามารถมองเห็นและจะได้รู้ไปในแนวทางเดียวกันว่า ตอนนี้อยู่ ณ state ใด

singleton pattern จะประกาศ instance เป็น static เพื่อทำให้ทุกๆ object ที่มากจาก class นั้นมองเห็น
เมื่อเริ่มการประกาศ class ก็จะทำให้ instance ที่เป็น static นั้นเริ่มมีชีวิตขึ้นในทันที
มีชีวิตก่อนที่จะประกาศ object ดังนั้นไม่ว่าจะมีกี่ object ก็จะมีแค่ instance เดียวที่ใช้งานร่วมกัน
เมื่อมีการเปลี่ยนแปลงค่าจาก object ใด ก็จะส่งผลให้ object อื่นๆมองเห็นค่าที่เปลี่ยนแปลงแล้ว

การประกาศ instance เป็น static ส่งผลให้ class อื่นๆสามารถเรียกใช้งานได้
โดยการเรียกใช้งานตรงๆโดยการใส่ scope ว่ามาจาก class ใด
cout << AClass::testInstance << endl;

ตัวอย่างนะ
จริงๆก้อไม่ค่อยได้ใช้หรอกนะ แต่เคยใช้เขียนเกม โดยให้ class Map ประกาศ static int level ดังนั้นส่งผลให้ทุกๆ class รู้ว่าตอนนี้ผู้เล่นอยู่ที่ level ไหน ทำให้เกมสามารถตอบสนองต่อผู้เล่นได้ถูกต้อง
ตามระดับ level ปัจจุบัน และเราก็ไม่จำเป็นต้องรับส่ง level ระหว่าง class เพราะว่าทุกๆ class มองเห็นอยู่แล้ว

ป.ล. - com-sci มีสอนวิชาที่มีเนื้อหาของการ design patterns อยู่นะคับ
- ถ้าพิมพ์ผิดประการใดก็ขออภัยด้วย (ช่วยบอกด้วยนะคับ)
รวบรวมผลงาน http://aspgod.com

OUE ----- อู๋ #19
User avatar
Spadez
Supervisor
 
Posts: 1360
Joined: Wed Jun 01, 2005 12:49 am
Location: อยู่ที่ไหนคงไม่สำคัญ ขอแค่ให้ฉันอยู่ใกล้ๆใจเธอก็พอ


Return to General Talk

Who is online

Users browsing this forum: No registered users and 2 guests

cron