Page 1 of 1

[Design Pattern]Singleton

PostPosted: Sun Jun 10, 2007 10:01 pm
by nat3
เห้อ บอร์ดนี้ช่างเงียบดีเจงๆมีคนเล่นอยู่คนเดียว ช่างมันไว้เป็นที่ฝากเรื่องปวดหัวละกัน

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 บ้างหรือยังเนี๊ยะ

PostPosted: Mon Jun 11, 2007 8:11 pm
by nat3
:cry: บอร์ดนี้มันเงียบเหงาเจงๆ ไม่มีแม้แต่คนมา comment เลยแฮะ
งอนไม่มาโพสท์แล้วดีกว่า :cry:

PostPosted: Mon Jun 11, 2007 8:42 pm
by Poron
โอ้โห มันมหัศจรรย์ขนาดนั้นเลยหรอคับ

ถ้ารู้ว่าทำอย่างนี้ได้ ตอนนั้น(ตอนไหนหว่า) คงทุ่นแรงไปเยอะเลยนะเนี่ย

PostPosted: Mon Jun 11, 2007 10:28 pm
by Inception
ก็อ่านเรื่อยๆอ่าพี่ ก็เพราะเห็นว่าพี่ชอบเอาเรื่องดีๆมาให้ ถึงให้พี่เป็นmod ห้องนี้อ่ะ

PostPosted: Tue Jun 12, 2007 7:12 pm
by nat3
กำลังคิดว่าจะเลิกโพสท์ที่บอร์ดนี้ไปโพสท์ที่ Free style แทนง่ะ พอตกค่อยย้ายมาเก็บ
ไม่ได้เลิกโพสท์ไปเลยหรอก

โพสท์ในนี้มันเหมือนคุยคนเดียวมาก วังเวงชอบกล คุยไปไม่มีคนตอบเลย

PostPosted: Thu Jun 21, 2007 8:14 pm
by SoUL
ตัว 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 เท่านั้น

ถูกหรือเปล่าหว่าถ้าผิดก็มีคนมาช่วยด้วยก็ดีนะ

PostPosted: Sun Jun 24, 2007 9:46 pm
by Spadez
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 อยู่นะคับ
- ถ้าพิมพ์ผิดประการใดก็ขออภัยด้วย (ช่วยบอกด้วยนะคับ)