ความแตกต่างระหว่างรูปแบบคงที่และรูปแบบซิงเกิล?


1767

อะไรคือความแตกต่างที่แท้จริง (เช่นในทางปฏิบัติ) ที่มีอยู่ระหว่างคลาสแบบสแตติกและรูปแบบซิงเกิล?

ทั้งสองสามารถถูกเรียกใช้โดยไม่มีการสร้างอินสแตนซ์ทั้งสองมีเพียง "อินสแตนซ์" หนึ่งรายการเท่านั้นและทั้งคู่ไม่มีความปลอดภัยต่อเธรด มีความแตกต่างอื่น ๆ อีกไหม?


4
ขึ้นอยู่กับการใช้ภาษาและรูปแบบการใช้งานของคุณซิงเกิลอาจมีประสิทธิภาพน้อยลงเนื่องจากค่าใช้จ่ายในการโทรหาgetInstance()วิธีการในแต่ละครั้งที่คุณต้องการใช้งาน (แม้ว่าในกรณีส่วนใหญ่อาจไม่สำคัญ )
php มากเกินไป

5
มีคำตอบมากมายอยู่แล้ว มันเป็นsingletonวัตถุที่staticเมธอดเป็นเพียงฟังก์ชั่นซึ่งเป็นเอนทิตีที่ไม่ใช่ OO
fastcodejava

4
ขึ้นอยู่กับการดำเนินการ .. csharpindepth.com/Articles/General/Singleton.aspx
VJAI

4
มีความแตกต่างเมื่อคุณต้องการอนุญาตให้บุคคลภายนอกจัดหาการใช้งานคลาส ในกรณีนี้คุณมักจะต้องใช้รูปแบบโรงงานเช่นกัน ดูagiletribe.wordpress.com/2013/10/08/…
AgilePro

IMO คำตอบนี้ได้ผลรวมกันเป็นอย่างดีstackoverflow.com/questions/14097656/ …
เดฟ

คำตอบ:


1251

อะไรทำให้คุณพูดว่าวิธีการแบบซิงเกิลหรือแบบสแตติกไม่ปลอดภัยต่อเธรด โดยปกติแล้วทั้งคู่ควรจะติดตั้งให้ปลอดภัยต่อเธรด

ความแตกต่างอย่างมากระหว่างซิงเกิลตันและเมธอดคงที่คือซิงเกิลตันสามารถใช้อินเทอร์เฟซ (หรือสืบทอดมาจากคลาสพื้นฐานที่มีประโยชน์แม้ว่ามันจะไม่ธรรมดาในประสบการณ์ของฉัน) ดังนั้นคุณสามารถผ่านรอบเดี่ยวได้ราวกับว่ามันเป็น "การใช้งาน


29
ถ้าคุณชอบมันไม่เป็นเธรดที่ปลอดภัยโดยเนื้อแท้คุณต้องทำให้มันเป็น threadsafe ทั้งคู่ดังนั้นจึงไม่มีความแตกต่าง
Jorge Córdoba

119
คุณสามารถให้ตัวอย่างของสิ่งที่เป็นเธรดที่ปลอดภัยโดยเนื้อแท้นอกเหนือจากประเภทที่ไม่เปลี่ยนรูป
Jon Skeet

26
ถึง Skeet: คนที่บอกว่าซิงเกิลตันไม่ใช่ threadsafe หมายความว่ามีการแชร์ซิงเกิลระหว่างเธรดโดยไม่จำเป็นตลอดเวลาในขณะที่วัตถุสแต็กจะถูกแชร์เมื่อคุณต้องการซึ่งหมายความว่าคุณไม่จำเป็นต้องซิงโครไนซ์ที่ไม่จำเป็น

45
@Geek: ลองนึกภาพซิงเกิลใช้อินเทอร์เฟซFooและคุณมีวิธีการFooเป็นพารามิเตอร์ ด้วยการตั้งค่านั้นผู้โทรสามารถเลือกที่จะใช้ซิงเกิลตันเป็นการนำไปใช้หรือพวกเขาอาจใช้การใช้งานที่แตกต่างกัน วิธีการถูกแยกออกจากซิงเกิล เปรียบเทียบกับสถานการณ์ที่คลาสเพิ่งมีเมธอดสแตติก - โค้ดทุกชิ้นที่ต้องการเรียกเมธอดเหล่านั้นถูกผนวกเข้ากับคลาสอย่างแน่นหนาเนื่องจากมันจำเป็นต้องระบุคลาสที่มีเมธอดสแตติก
Jon Skeet

10
@AmirBareket: มันไม่ได้เป็นซิงเกิลตันตามรูปแบบการออกแบบซิงเกิล แต่ - ถ้าคลาสนั้นอนุญาตให้สร้างหลาย ๆ อินสแตนซ์มันไม่ใช่ IMO ซิงเกิลตันโดยไม่คำนึงว่าโรงงานทำอะไร
Jon Skeet

476

คำตอบที่แท้จริงคือโดยจอนสกีต, ฟอรั่มที่นี่อีก

ซิงเกิลตันอนุญาตให้เข้าถึงอินสแตนซ์ที่สร้างเดียว - อินสแตนซ์นั้น (หรือมากกว่านั้นการอ้างอิงถึงอินสแตนซ์นั้น) สามารถส่งผ่านเป็นพารามิเตอร์ไปยังวิธีการอื่น ๆ และถือว่าเป็นวัตถุปกติ

คลาสสแตติกอนุญาตให้ใช้วิธีสแตติกเท่านั้น


64
ทำไมคุณถึงผ่าน Singleton เป็นพารามิเตอร์ แต่ถ้าคุณสามารถเข้าถึงอินสแตนซ์เดียวกันจากที่ใดก็ได้โดยการเรียกเมธอด getInstance () แบบคงที่?
Henrique Ordine

23
@HenriqueOrdine เพื่อให้สามารถใส่รหัสที่มีอยู่และให้อินเตอร์เฟซหรือไม่

6
@HenriqueOrdine พวกเขากำลังพูดถึงคลาสคงที่ไม่ใช่คลาสที่มีวิธีการคงที่ คลาสสแตติกไม่สามารถสร้างอินสแตนซ์ได้ อย่างไรก็ตามหากคุณผ่านอินสแตนซ์ของคลาส (ไม่คงที่) ที่มีวิธีการคงที่คุณไม่สามารถเรียกวิธีการคงที่ในอินสแตนซ์
Goran

3
คลาสแบบคงที่คืออะไร อย่างน้อยใน Java ไม่มีสิ่งนั้น
Henrique Ordine

16
@ ตอนแรกฉันสับสนกับถ้อยคำของคุณมาก คุณพูดว่า "คุณไม่สามารถเรียกวิธีการคงที่ในอินสแตนซ์" ฉันอ่านว่า "ถ้าคุณมีการอ้างอิงไปยังวัตถุที่เป็นอินสแตนซ์คุณไม่สามารถเรียกวิธีการคงที่ใด ๆ ที่อาจมี" แน่นอนว่าไม่ถูกต้อง หลังจากอ่านอีกสองสามครั้งฉันคิดว่าคุณหมายถึง "จากวิธีการคงที่ภายในคุณไม่สามารถเข้าถึงวัตถุที่ไม่คงที่ในชั้นเรียน" ซึ่งถูกต้อง ต้องการชี้แจงว่าสำหรับใครก็ตามที่ยังไม่คุ้นเคยกับแนวคิดเหล่านี้ที่เจอคำตอบนี้และอ่านความคิดเห็นของคุณ
Andrew Steitz

359
  1. วัตถุซิงเกิลถูกเก็บไว้ในกองแต่วัตถุคงถูกเก็บไว้ในสแต็ค
  2. เราสามารถโคลน (ถ้าผู้ออกแบบไม่ได้ไม่อนุญาต) วัตถุเดี่ยว แต่เราไม่สามารถโคลนวัตถุคลาสคงที่
  3. คลาส Singleton ปฏิบัติตามOOP (หลักการเชิงวัตถุ) คลาสแบบสแตติกไม่
  4. เราสามารถใช้interfaceคลาสที่มี Singleton แต่วิธีการคงที่ของคลาส (หรือเช่น C # static class) ไม่สามารถทำได้

99
ประโยคที่สองผิด เราไม่สามารถโคลนวัตถุซิงเกิลตัน การใช้งานซิงเกิลต้องปฏิเสธสิ่งนี้ ถ้าคุณสามารถโคลนซิงเกิลจริง ๆ มันไม่ใช่ซิงเกิล
Alexander Yancharuk

19
คำตอบนี้ไม่ถูกต้องสำหรับ Java: ทั้ง singleton และ static ใช้ stack
AgilePro

72
# 1 ไม่สำคัญ # 2 อธิบายการใช้งานที่มีข้อบกพร่อง # 3 ไม่สามารถแสดงเหตุผลได้อย่างสมบูรณ์
Casey

31
วัตถุสแตติกสามารถเก็บไว้ในกองซ้อนได้อย่างไร? เฟรมสแต็กใหม่จะถูกสร้างขึ้นเมื่อคุณเรียกใช้เมธอดซึ่งจะเก็บตัวแปรโลคัลของเมธอดเฟรมสแต็กนี้จะถูกลบออกเมื่อเมธอดส่งคืนและตัวแปรโลคัลเหล่านั้นหายไป แน่นอนว่าสแต็กรวดเร็ว แต่ไม่เหมาะสำหรับการจัดเก็บวัตถุสแตติก
mike_m

23
ฉันไม่สามารถเข้าใจจำนวนผู้ลงคะแนนในรายการนี้ได้ 1) เหตุใดจึงต้องจัดเก็บแบบเดี่ยวไว้ในสแต็ก ในภาษาที่ได้รับการจัดการเช่น C # หรือข้อมูล Java จะถูกเก็บไว้ในฮีปที่มีการจัดการยกเว้นตัวแปร / พารามิเตอร์ของเมธอดโลคัล 2) ถ้าคุณสามารถโคลนมันได้มันไม่ได้เป็นซิงเกิลที่ถูกนำมาใช้อย่างถูกต้อง 3) Singleton เป็นที่รู้จักกันในนาม OOP anti-pattern คือสิ่งที่คุณควรหลีกเลี่ยงถ้าเป็นไปได้ 4) นี่คือสิ่งเดียวที่ถูกต้อง
Groo

152

รูปแบบซิงเกิลมีข้อดีหลายประการมากกว่าคลาสสแตติก ก่อนอื่นซิงเกิลสามารถขยายคลาสและใช้อินเทอร์เฟซได้ในขณะที่คลาสสแตติกไม่สามารถ (มันสามารถขยายคลาสได้ แต่จะไม่สืบทอดสมาชิกอินสแตนซ์ของมัน) ซิงเกิลสามารถเริ่มต้นได้อย่างเกียจคร้านหรือแบบอะซิงโครนัสในขณะที่คลาสสแตติกจะเริ่มต้นได้เมื่อโหลดครั้งแรกซึ่งนำไปสู่ปัญหาตัวโหลดคลาสที่มีศักยภาพ อย่างไรก็ตามข้อได้เปรียบที่สำคัญที่สุดคือการที่สามารถจัดการ polymorphically ได้โดยไม่บังคับให้ผู้ใช้สันนิษฐานว่ามีเพียงอินสแตนซ์เดียวเท่านั้น


10
+1 สำหรับคะแนนที่ดีและใช้งานได้จริง รูปแบบซิงเกิลมากเกินไปโดยทั่วไป แต่มีบางสถานการณ์ที่เหมาะสม ดูเพิ่มเติมที่: agiletribe.wordpress.com/2013/10/08/…
AgilePro

3
คุณพูดถูกเกี่ยวกับความได้เปรียบของการเป็น polymorphic นี่คือจุดที่สำคัญที่สุด
Ahmad

คลาสสแตติกแบบซ้อนสามารถใช้อินเตอร์เฟสได้ ลองเข้ารหัสมันใช้งานได้ ฉันสามารถรวบรวมรหัสโดยไม่มีข้อผิดพลาดใด ๆ
nanosoft

75

staticคลาสไม่ได้มีไว้สำหรับสิ่งใดที่ต้องการสถานะ มันมีประโยชน์สำหรับการรวมกลุ่มของฟังก์ชั่นเข้าด้วยกันเช่นMath(หรือUtilsในโครงการ) ดังนั้นชื่อชั้นจะให้เบาะแสแก่เราซึ่งเราสามารถหาฟังก์ชั่นและไม่มีอะไรเพิ่มเติม

Singletonเป็นรูปแบบที่ฉันโปรดปรานและฉันใช้มันเพื่อจัดการบางอย่างในจุดเดียว มีความยืดหยุ่นมากกว่าstaticคลาสและสามารถรักษาสถานะไว้ได้ สามารถใช้อินเตอร์เฟสรับมาจากคลาสอื่นและอนุญาตให้สืบทอด

กฎของฉันสำหรับการเลือกระหว่างstaticและsingleton:

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


16
ทำไมคลาสสแตติกควรไม่ทำสิ่งใดที่จำเป็นต้องบันทึกสถานะ
เดินขบวน

12
@Trisped: คุณไม่สามารถควบคุมการกำหนดค่าเริ่มต้นหรือการสรุปได้อย่างแม่นยำ
Xaqron

7
คุณทำให้ฉันที่ "Singleton เป็นรูปแบบที่ฉันชอบ" ซิงเกิลตันนั้นเป็นมุมที่เฉียบแหลมซึ่งมันควรจะถูกพิจารณาว่าเป็น anti-pattern และ pattern คลาสสามารถมีสถานะสแตติกได้ดีนั่นคือการเข้าถึงเพียงครั้งเดียวหากมีสิ่งใดที่สถานะสแตติกมากกว่า "การเข้าถึงครั้งเดียว" มากกว่าซิงเกิลตัน คุณสามารถโคลนซิงเกิลตันในขณะที่สแตติกได้รับการนิยามจากคำว่าให้เป็นเอกลักษณ์
PoweredByRice

1
การรักษาสถานะหมายความว่าอย่างไร รัฐคืออะไร
Kyle Delaney

2
@ KyleDelaney: Stateเป็นเพียงการรวมกันของคุณสมบัติที่แตกต่างกันของวัตถุซึ่งมักจะเปลี่ยนแปลงตลอดเวลา คุณสามารถ Google สำหรับคำจำกัดความที่เป็นทางการ
Xaqron

65

คลาสคงที่: -

  1. คุณไม่สามารถสร้างอินสแตนซ์ของคลาสแบบคงที่

  2. โหลดโดยอัตโนมัติโดย. NET Framework ภาษาทั่วไปรันไทม์ (CLR) เมื่อมีการโหลดโปรแกรมหรือ namespace ที่มีคลาส

  3. คลาสคงที่ไม่สามารถมีตัวสร้าง

  4. เราไม่สามารถส่งผ่านคลาสสแตติกไปยังเมธอด

  5. เราไม่สามารถสืบทอดคลาสสแตติกไปยังคลาสสแตติกอื่นใน C #

  6. ชั้นเรียนที่มีวิธีการคงที่ทั้งหมด

  7. ประสิทธิภาพที่ดีขึ้น (วิธีคงที่จะถูกผูกมัดในเวลารวบรวม)

ซิงเกิล: -

  1. คุณสามารถสร้างหนึ่งอินสแตนซ์ของวัตถุและนำมาใช้ใหม่

  2. อินสแตนซ์ซิงเกิลถูกสร้างขึ้นเป็นครั้งแรกเมื่อผู้ใช้ร้องขอ

  3. คลาส Singleton สามารถมี Constructor ได้

  4. คุณสามารถสร้างวัตถุของคลาสซิงเกิลตันและส่งต่อไปยังเมธอด

  5. คลาสซิงเกิลไม่ได้กล่าวถึงข้อ จำกัด ของการสืบทอด

  6. เราสามารถกำจัดวัตถุของคลาสซิงเกิลตัน แต่ไม่ใช่คลาสสแตติก

  7. สามารถแทนที่เมธอดได้

  8. สามารถขี้เกียจโหลดได้เมื่อต้องการ (มีการโหลดคลาสแบบคงที่เสมอ)

  9. เราสามารถใช้อินเตอร์เฟส (คลาสคงที่ไม่สามารถใช้อินเตอร์เฟส)


13
คลาสสแตติกจะมีตัวสร้าง: msdn.microsoft.com/en-us/library/k9x6w0hc.aspx
Tomer Arazy

2
ใช่สแตติกสามารถมีคอนสตรัคเตอร์ซึ่งอยู่ภายในคลาสนั้นได้ สิ่งนี้จะถูกเรียกใช้เมื่อเมธอดสแตติกใด ๆ ในคลาสถูกเรียก
rahulmr

สำหรับ singleton on compile time มันจะถูกเก็บไว้ในหน่วยความจำ HEAP แต่ถ้ามันได้รับอินสแตนซ์หนึ่งครั้งมันจะถูกเก็บไว้ใน STACK หรือไม่?
Luminous_Dev

@Luminous_Dev ไม่อินสแตนซ์เดี่ยวใด ๆ เป็นอินสแตนซ์ของวัตถุในตอนท้ายของวัน มันจะถูกเก็บไว้ในกองอย่างไม่ต้องสงสัย
RBT

1
@hahulmr ความแตกต่างที่สำคัญ: คอนสตรัคเตอร์ยังได้รับการเรียกใช้ก่อนที่อินสแตนซ์แรก (AKA เท่านั้น) จะถูกสร้างขึ้น
CoolOppo

53

คลาสสแตติกเป็นคลาสที่มีเมธอดสแตติกเท่านั้นซึ่งคำที่ดีกว่าจะเป็น "ฟังก์ชัน" สไตล์การออกแบบเป็นตัวเป็นตนในระดับคงที่เป็นขั้นตอนอย่างหมดจด

ในทางกลับกัน Singleton เป็นรูปแบบเฉพาะสำหรับการออกแบบ OO มันเป็นตัวอย่างของวัตถุ (ด้วยความเป็นไปได้ทั้งหมดที่มีอยู่ในนั้นเช่นความหลากหลาย) ด้วยกระบวนการสร้างที่ทำให้มั่นใจได้ว่ามีเพียงตัวอย่างเดียวของบทบาทนั้นตลอดช่วงอายุการใช้งาน


1
ความแตกต่างไม่ได้เข้ามาเล่นกับ singletons ที่ทุกคน

32
ดังนั้นคุณคิดว่า ฉันคิดแตกต่าง ;) ตัวอย่างเช่นลองนึกภาพโรงงานเดี่ยวที่ส่งคืนอินเทอร์เฟซ คุณรู้ว่าคุณได้รับ ISingleton (และมันก็เหมือนกันตลอดไป) แต่ไม่จำเป็นว่าจะต้องใช้งานแบบใด
Morendil

คลาสแบบคงที่ซ้อนกันสามารถมีวิธีการอินสแตนซ์เช่นกันมันไม่ได้ถูก จำกัด ให้มีวิธีการแบบคงที่เท่านั้น .. รหัสนั้นและคุณสามารถดู
nanosoft

ในภาษาที่มีโมเดลวัตถุ nicer (เช่น Ruby) คลาสจะเป็นวัตถุด้วย ลักษณะ "ขั้นตอนอย่างหมดจด" ของคลาสสแตติกคือข้อ จำกัด ที่กำหนดโดยภาษา
สูงสุด

36

ในรูปแบบซิงเกิลคุณสามารถสร้างซิงเกิลตันเป็นอินสแตนซ์ของชนิดที่ได้รับคุณไม่สามารถทำได้ด้วยคลาสแบบสแตติก

ตัวอย่างด่วน:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

39
มันไม่ใช่รูปแบบซิงเกิลจริงๆดูเหมือนโรงงานจากฉัน
vava

10
ไม่จริงความแตกต่างพื้นฐานระหว่างสองคือว่า Singleton จะ "แคช" วัตถุเดียวและกลับมา (อ้างอิงถึง) เดียวกัน รูปแบบจากโรงงานจะสร้างอินสแตนซ์ใหม่
Mystic

12
จากนั้นเป็น proxy-singleton :)
vava

3
อืมฉันรู้ถึงความหลากหลายของซิงเกิลตันนี้ว่า MonoState
Huppie

เช่นรูปแบบโรงงาน
Rajavel D

26

เพื่อขยายคำตอบของ Jon Skeet

ความแตกต่างอย่างมากระหว่างซิงเกิลตันและเมธอดคงที่คือซิงเกิลตันสามารถใช้อินเทอร์เฟซ (หรือสืบทอดมาจากคลาสพื้นฐานที่มีประโยชน์แม้ว่าจะเป็น IME ทั่วไปที่น้อยกว่า) ดังนั้นคุณสามารถผ่านรอบซิงเกิลตันราวกับว่ามันเป็น

Singletons ง่ายต่อการใช้งานเมื่อหน่วยทดสอบชั้นเรียน เมื่อใดก็ตามที่คุณผ่าน singletons เป็นพารามิเตอร์ (constructors, setters หรือ method) คุณสามารถแทนที่รุ่น singleton ที่เยาะเย้ยหรือ stubbed


ฉันไม่คิดว่าคุณจะล้อเลียนแบบซิงเกิลได้โดยตรง คุณไม่ต้องประกาศอินเตอร์เฟสที่ทั้ง singleton และคลาส mock ใช้หรือไม่?
Ellen Spertus

@ espertus ทำไมคุณไม่หัวเราะเยาะคุณในซิงเกิล? ตัวอย่างการใช้ MySingleton mockOfMySingleton = mock(MySingleton.class)Mockito
Mike Rylander

คุณพูดถูกคุณสามารถเยาะเย้ยด้วยเครื่องมือเช่น mockito ที่ใช้การสะท้อน ฉันหมายความว่าคุณไม่สามารถเยาะเย้ยมันโดยตรงโดยการ subclassing มันและเอาชนะวิธีการของมัน
Ellen Spertus

@ espertus ทำไมล่ะ เมื่อคุณสร้างอินสแตนซ์ของวัตถุที่คุณกำลังทดสอบคุณสามารถแทนที่การใช้คลาสย่อยของซิงเกิลตันของคุณได้ทุกที่ที่คุณจะใช้ต้นฉบับ Ex:new ClazzToTest(mockSingleton);
ไมค์ Rylander

ฉันไม่ได้ใช้ Mockito แต่คุณจะสามารถแบ่งคลาสที่มี Constructor ส่วนตัวได้ซึ่งเป็นกรณีของ singletons ยกเว้นการใช้การสะท้อน การสนทนาที่เกี่ยวข้อง: stackoverflow.com/questions/2302179/mocking-a-singleton-class stackoverflow.com/questions/15939023/…
Ellen Spertus

23

นี่เป็นบทความที่ดี: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

คลาสแบบคงที่

  • ชั้นเรียนที่มีทั้งหมดวิธีการคง
  • ประสิทธิภาพที่ดีขึ้น (วิธีคงที่จะถูกผูกมัดในเวลารวบรวม)
  • ไม่สามารถแทนที่เมธอด แต่สามารถใช้การซ่อนเมธอดได้ ( วิธีซ่อนเร้นใน Java คืออะไรแม้แต่คำอธิบาย JavaDoc ยังสับสน )

    public class Animal {
        public static void foo() {
            System.out.println("Animal");
        }
    }
    
    public class Cat extends Animal {
        public static void foo() {  // hides Animal.foo()
            System.out.println("Cat");
        }
    }
    

ซิงเกิล

โดยสรุปฉันจะใช้คลาสแบบคงที่เท่านั้นสำหรับวิธีการเก็บแบบ util และใช้ Singleton สำหรับทุกอย่างอื่น


การแก้ไข


4
ฉันไม่รู้เกี่ยวกับ java แต่ใน. Net จุดสองจุดสุดท้ายของคุณไม่ถูกต้อง คลาสแบบคงที่สามารถอ้างอิงการทดสอบแบบคงที่และฟิลด์ดังนั้นสถานะจะเท่ากัน และพวกมันถูกโหลดขี้เกียจ - ตัวสร้างสแตติกเรียกใช้เมื่อ: 1) อินสแตนซ์ของคลาสถูกสร้างขึ้น 2) อ้างอิงสมาชิกแบบคงที่ของคลาสใด ๆ 1 ใช้ไม่ได้ซึ่งจะทิ้งไว้ 2 ดังนั้นคลาสแบบคงที่จะไม่โหลดจนกว่าจะมีการใช้งานครั้งแรก
jmoreno

1
สำหรับคลาสสแตติกแม้ว่าคุณจะไม่สามารถแทนที่เมธอดสแตติกคุณสามารถซ่อนเมธอดสแตติกจากพาเรนต์
Max Peng

ถ้าเป็นเช่นAnimal animal = new Cat();นั้นanimal.foo();จะเกิดอะไรขึ้น?
Luminous_Dev

@jmoreno คลาสคงไม่ถูกโหลดจนกว่าจะใช้ครั้งแรก? ฉันเชื่อว่ามันถูกเก็บไว้ในหน่วยความจำสแต็คในเวลารวบรวม และเข้าถึงได้ทันที .. ใช่ไหม?
Luminous_Dev

@Luminous_Dev: อย่างน้อยสำหรับ. net คลาสแบบสแตติกจะมีตัวสร้างที่ทำงานเมื่อเข้าถึงครั้งแรกดังนั้นจึงไม่สามารถเข้าถึงได้ทันที ตัวสร้างแบบคงที่ในทางทฤษฎีสามารถใช้เวลาไม่ จำกัด โดยที่มัน (หรือคลาสอื่นถูกเก็บไว้) เป็นรายละเอียดการใช้งานซึ่งไม่เกี่ยวข้องกับคำถามนี้จริงๆ
jmoreno

22

ข้อดีอีกอย่างของซิงเกิลตันคือสามารถทำให้เป็นอนุกรมได้ง่ายซึ่งอาจจำเป็นถ้าคุณต้องการบันทึกสถานะไว้ในแผ่นดิสก์หรือส่งไปที่อื่นจากระยะไกล


19

ฉันไม่ใช่นักทฤษฎี OO ที่ยอดเยี่ยม แต่จากสิ่งที่ฉันรู้ฉันคิดว่าคุณสมบัติ OO เดียวที่คลาสแบบสแตติกขาดเมื่อเทียบกับ Singletons คือ polymorphism แต่ถ้าคุณไม่ต้องการใช้คลาสแบบคงที่คุณสามารถมีการสืบทอด (ไม่แน่ใจเกี่ยวกับการใช้อินเตอร์เฟส) และการห่อหุ้มข้อมูลและฟังก์ชั่น

ความคิดเห็นของ Morendil "สไตล์การออกแบบเป็นตัวเป็นตนในคลาสแบบคงที่เป็นขั้นตอนอย่างหมดจด" ฉันอาจจะผิด แต่ฉันไม่เห็นด้วย ในวิธีการแบบคงที่คุณสามารถเข้าถึงสมาชิกแบบคงที่ซึ่งจะเหมือนกับวิธีการแบบซิงเกิลที่เข้าถึงสมาชิกอินสแตนซ์เดียวของพวกเขา

แก้ไข:
จริง ๆ แล้วฉันคิดว่าตอนนี้ความแตกต่างอีกอย่างหนึ่งคือคลาสแบบคงที่ถูกสร้างอินสแตนซ์เมื่อเริ่มต้นโปรแกรม * และใช้ชีวิตตลอดช่วงชีวิตทั้งหมดของโปรแกรมในขณะที่ซิงเกิลตันถูกสร้างอินสแตนซ์ชัดเจน

* หรือฉันอาจใช้อินสแตนซ์เมื่อใช้ครั้งแรกขึ้นอยู่กับภาษาที่ฉันใช้


15
ใช่ทุกคนดูเหมือนจะเพิกเฉยต่อความจริงที่ว่าคลาสที่มีวิธีการแบบสแตติกสามารถมีฟิลด์สแตติกส่วนตัวซึ่งยังคงสามารถใช้เพื่อรักษาสถานะ (และเปิดเผยบางส่วนของพวกเขาไปยังรหัสลูกค้าผ่านทางเซ็ตเตอร์ / getters สาธารณะ)
289463

17

เพื่อแสดงให้เห็นถึงจุดของจอนสิ่งที่แสดงด้านล่างไม่สามารถทำได้ถ้า Logger เป็นคลาสคงที่คลาสSomeClassคาดว่าอินสแตนซ์ของILoggerการใช้งานจะถูกส่งผ่านเข้าไปในตัวสร้างของมัน

คลาส Singleton มีความสำคัญสำหรับการฉีดแบบพึ่งพาได้

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var someClass = new SomeClass(Logger.GetLogger());
        }


    }

    public class SomeClass 
    {
        public SomeClass(ILogger MyLogger)
        {

        }
    }

    public class Logger : ILogger
    {
        private static Logger _logger;
        private Logger() { }

        public static Logger GetLogger()
        {
            if (_logger==null)
            {
                _logger = new Logger();
            }

            return _logger;
        }

        public void Log()
        {

        }

    }


    public interface ILogger
    {
         void Log();
    }
}

13

ซิงเกิลตันเป็นคลาสปกติที่ถูกสร้างอินสแตนซ์ แต่เพียงครั้งเดียวและโดยอ้อมจากรหัสลูกค้า คลาสสแตติกไม่ได้สร้างอินสแตนซ์ เท่าที่ฉันรู้วิธีการคงที่ (ระดับคงที่จะต้องมีวิธีการแบบคงที่) เร็วกว่าแบบคงที่

แก้ไข:
คำอธิบายกฎการปฏิบัติงาน FxCop: "วิธีการที่ไม่สามารถเข้าถึงข้อมูลอินสแตนซ์หรือวิธีการโทรสามารถทำเครื่องหมายเป็นแบบคงที่ (แชร์ใน VB) หลังจากทำเช่นนั้นคอมไพเลอร์จะส่งไซต์โทรที่ไม่ใช่เสมือนไปยังสมาชิกเหล่านี้ ตรวจสอบรันไทม์สำหรับการโทรแต่ละครั้งที่มั่นใจว่าตัวชี้วัตถุปัจจุบันไม่เป็นโมฆะซึ่งอาจส่งผลให้ได้รับประสิทธิภาพที่วัดได้สำหรับโค้ดที่ไวต่อประสิทธิภาพในบางกรณีความล้มเหลวในการเข้าถึงอินสแตนซ์วัตถุปัจจุบันแสดงถึงปัญหาความถูกต้อง
ฉันไม่รู้จริง ๆ ว่าสิ่งนี้ใช้ได้กับเมธอดสแตติกในคลาสแบบคงที่หรือไม่


11

Singleton's นั้นอินสแตนซ์มันมีเพียงอินสแตนซ์เดียวเท่านั้นที่อินสแตนซ์ที่เคยดังนั้นซิงเกิลใน Singleton

คลาสสแตติกไม่สามารถสร้างอินสแตนซ์ได้โดยสิ่งอื่นนอกจากตัวเอง


คลาสสแตติกสามารถสร้างอินสแตนซ์ได้มากในจาวา อ่าน docs.oracle.com/javase/tutorial/java/javaOO/nested.html อ้างถึงคำตอบของฉันstackoverflow.com/a/37114702/1406510
nanosoft

8

ความแตกต่างที่สำคัญคือ:

  • Singleton มีอินสแตนซ์ / วัตถุในขณะที่คลาสสแตติกเป็นพวงของวิธีการสแตติก
  • Singleton สามารถขยายได้เช่นผ่านส่วนติดต่อในขณะที่คลาสแบบสแตติกไม่สามารถทำได้
  • Singleton สามารถสืบทอดซึ่งสนับสนุนหลักการเปิด / ปิดในหลักการ SOLID ในคลาสคงที่ไม่สามารถสืบทอดและเราจำเป็นต้องทำการเปลี่ยนแปลงในตัวเอง
  • วัตถุ Singleton สามารถส่งผ่านไปยังวิธีการในขณะที่คลาสแบบคงที่เนื่องจากไม่มีอินสแตนซ์ไม่สามารถส่งผ่านเป็นพารามิเตอร์

7

Singleton เป็นวิธีที่ดีกว่าจากมุมมองการทดสอบ ซึ่งแตกต่างจากคลาสแบบคงที่ซิงเกิลสามารถใช้อินเตอร์เฟสและคุณสามารถใช้อินสแตนซ์จำลองและฉีดได้

ในตัวอย่างด้านล่างฉันจะอธิบายสิ่งนี้ สมมติว่าคุณมีเมธอด isGoodPrice () ซึ่งใช้เมธอด getPrice () และคุณใช้ getPrice () เป็นเมธอดในซิงเกิล

ซิงเกิลที่ให้ฟังก์ชั่น getPrice:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

การใช้ getPrice:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

การใช้งาน Singleton ขั้นสุดท้าย:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

ชั้นทดสอบ:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

ในกรณีที่เราเลือกใช้วิธีการคงที่ในการใช้ getPrice () มันยากที่จะจำลอง getPrice () คุณสามารถเยาะเย้ยแบบคงที่ด้วยการเยาะเย้ยพลังงาน แต่ผลิตภัณฑ์บางอย่างไม่สามารถใช้งานได้


1
ตอนนี้ไม่ปลอดภัยแล้วและน่ารังเกียจในแง่ของวิธีที่คุณเข้าถึงการใช้อินเทอร์เฟซ แน่นอนว่าการมีอินเทอร์เฟซนั้นดีสำหรับการทดสอบ - แต่ทำไมต้องรำคาญกับซิงเกิล? เพียงหลีกเลี่ยงการมีซิงเกิลทั้งหมด มีชั้นเรียนหนึ่งชั้นเพื่อการใช้งานจริงเพื่อการผลิตหนึ่งระดับเพื่อจุดประสงค์ในการทดสอบและฉีดตัวอย่างที่ถูกต้องขึ้นอยู่กับสิ่งที่คุณทำ ไม่จำเป็นต้องเชื่อมต่อซิงเกิลกับผู้โทรเข้าเลย
Jon Skeet

ขอบคุณสำหรับความคิดเห็น. มันง่ายมากที่จะทำให้มันปลอดภัย นอกจากนี้ฉันใช้ซิงเกิลตันเพื่อการแคช
Amir Bareket

1
ใช่แม้ว่าจะมีค่าใช้จ่ายที่ไม่มีจุดหมาย อีกครั้งมันง่ายกว่าที่จะไม่ใช้ซิงเกิล
Jon Skeet

6

ฉันเห็นด้วยกับคำจำกัดความนี้:

คำว่า " เดี่ยว " หมายถึงวัตถุเดียวตลอดวงจรชีวิตของแอปพลิเคชันดังนั้นขอบเขตอยู่ที่ระดับแอปพลิเคชัน

แตติกไม่มีตัวชี้วัตถุใด ๆ ดังนั้นขอบเขตอยู่ที่ระดับ App Domain

นอกจากนี้ทั้งสองควรถูกนำมาใช้เพื่อให้ปลอดภัยต่อเธรด

คุณสามารถค้นหาความแตกต่างอื่น ๆ ที่น่าสนใจเกี่ยวกับ: Singleton Pattern Versus Static Class


5

ความแตกต่างที่โดดเด่นอย่างหนึ่งคือการสร้างอินสแตนซ์ที่แตกต่างที่มาพร้อมกับซิงเกิลตัน

ด้วยคลาสสแตติกมันถูกสร้างโดย CLR และเราไม่ได้ควบคุมมัน ด้วย singletons วัตถุจะถูกสร้างอินสแตนซ์บนอินสแตนซ์แรกที่พยายามเข้าถึง


4

ในหลายกรณีทั้งสองนี้ไม่มีความแตกต่างในทางปฏิบัติโดยเฉพาะอย่างยิ่งหากอินสแตนซ์ซิงเกิลไม่เคยเปลี่ยนแปลงหรือเปลี่ยนแปลงช้ามากเช่นการกำหนดค่า

ฉันจะบอกว่าความแตกต่างที่ใหญ่ที่สุดคือซิงเกิลตันยังคงเป็น Java Bean ปกติตรงข้ามกับคลาส Java เฉพาะแบบคงที่เท่านั้น และด้วยเหตุนี้จึงมีการยอมรับซิงเกิลตันในหลาย ๆ สถานการณ์ อันที่จริงแล้วเป็นกลยุทธ์เริ่มต้นการเริ่มต้นของ Spring Framework ผู้บริโภคอาจทราบหรือไม่ว่ามันเป็นซิงเกิลตันที่ถูกส่งผ่านไปมันแค่ปฏิบัติต่อมันเหมือนกับ Java bean ปกติ หากความต้องการเปลี่ยนแปลงและซิงเกิลตันต้องกลายเป็นต้นแบบแทนดังที่เรามักจะเห็นใน Spring มันสามารถทำได้อย่างสมบูรณ์โดยไม่ต้องเปลี่ยนรหัสผู้บริโภค

มีคนอื่นพูดถึงก่อนหน้านี้ว่าคลาสสแตติกควรเป็นขั้นตอนอย่างหมดจดเช่น java.lang.Math ในความคิดของฉันคลาสนี้ไม่ควรผ่านไปมาและพวกเขาไม่ควรถือสิ่งอื่นใดนอกจากสถิตสุดท้ายเป็นคุณลักษณะ สำหรับทุกสิ่งทุกอย่างให้ใช้ซิงเกิลตันเนื่องจากมีความยืดหยุ่นและบำรุงรักษาได้ง่ายกว่ามาก


4

เรามีเฟรมเวิร์ก DB ของเราที่ทำให้การเชื่อมต่อไปยัง Back end เพื่อหลีกเลี่ยงการอ่านสกปรกในผู้ใช้หลายคนเราได้ใช้รูปแบบซิงเกิลเพื่อให้แน่ใจว่าเรามีอินสแตนซ์เดียวที่สามารถใช้ได้ทุกเวลา

ใน c # คลาสสแตติกไม่สามารถใช้อินเตอร์เฟสได้ เมื่อคลาสอินสแตนซ์เดียวจำเป็นต้องใช้อินเทอร์เฟซสำหรับสัญญาธุรกิจหรือวัตถุประสงค์ IoC นี่คือที่ฉันใช้รูปแบบ Singleton โดยไม่มีคลาสแบบสแตติก

Singleton จัดให้มีวิธีการรักษาสถานะในสถานการณ์ไร้สัญชาติ

หวังว่าจะช่วยคุณ ..


3
  1. ขี้เกียจโหลด
  2. การสนับสนุนอินเทอร์เฟซเพื่อให้สามารถดำเนินการแยกต่างหาก
  3. ความสามารถในการส่งคืนชนิดที่ได้รับ (เป็นการรวมกันของ lazyloading และการใช้อินเตอร์เฟส)

คลาสสแตติกที่ซ้อนกันสามารถนำอินเตอร์เฟสมาใช้อย่างมากใน java จุดที่สองของคุณคือผิด
nanosoft

3

การทำให้เป็นอนุกรม - สมาชิกแบบสแตติกอยู่ในคลาสและดังนั้นจึงไม่สามารถทำให้เป็นอนุกรมได้

ข แม้ว่าเราจะกำหนดให้ constructor เป็นส่วนตัว แต่ตัวแปรสมาชิกแบบสแตติกจะยังคงถูกนำไปใช้ในคลาสย่อย

ค. เราไม่สามารถเริ่มต้นขี้เกียจได้เพราะทุกอย่างจะถูกโหลดเมื่อโหลดคลาสเท่านั้น


3

จากมุมมองของลูกค้าพฤติกรรมแบบคงที่เป็นที่รู้จักกับลูกค้า แต่พฤติกรรม Singleton สามารถเสร็จสมบูรณ์ซ่อนจากลูกค้า ลูกค้าอาจไม่เคยรู้เลยว่ามีเพียงหนึ่งอินสแตนซ์เดียวที่เขาเล่นด้วยซ้ำแล้วซ้ำอีก


3

ฉันอ่านข้อความต่อไปนี้และคิดว่ามันสมเหตุสมผลด้วย:

ดูแลกิจการ

โปรดจำไว้ว่าหนึ่งในกฎ OO ที่สำคัญที่สุดคือวัตถุรับผิดชอบตัวเอง ซึ่งหมายความว่าปัญหาเกี่ยวกับวงจรชีวิตของคลาสควรได้รับการจัดการในชั้นเรียนไม่ได้รับมอบหมายให้สร้างโครงสร้างภาษาเช่นสแตติกและอื่น ๆ

จากกระบวนการคิดเชิงวัตถุเล่มที่ 4 เอ็ด


ฉันไม่เห็นด้วยเพราะนี่เป็นการเพิ่มความรับผิดชอบให้กับชั้นเรียนซึ่ง (สมมติว่าทำอะไรก็ได้) หมายความว่าตอนนี้ละเมิดหลักการความรับผิดชอบเดี่ยว
ช่างเขียน

3

ในบทความที่ฉันเขียนฉันได้อธิบายมุมมองของฉันเกี่ยวกับสาเหตุที่ซิงเกิลดีกว่าคลาสแบบคงที่:

  1. คลาสแบบสแตติกไม่ใช่คลาสแบบบัญญัติซึ่งเป็นเนมสเปซที่มีฟังก์ชันและตัวแปร
  2. การใช้คลาสคงที่ไม่ใช่วิธีปฏิบัติที่ดีเนื่องจากการทำลายหลักการการเขียนโปรแกรมเชิงวัตถุ
  3. คลาสแบบสแตติกไม่สามารถส่งผ่านเป็นพารามิเตอร์สำหรับตัวอื่นได้
  4. คลาสสแตติกไม่เหมาะสำหรับการเริ่มต้น“ ขี้เกียจ”
  5. การกำหนดค่าเริ่มต้นและการใช้คลาสแบบคงที่มักจะถูกติดตามอย่างหนัก
  6. การนำการจัดการเธรดมาใช้นั้นทำได้ยาก

ฉันจะแปรงขึ้นสำหรับไวยากรณ์ภาษาอังกฤษ แต่อย่างอื่นก็เป็นที่น่าสนใจอ่าน :)
Noctis

3
  1. เราสามารถสร้างวัตถุของคลาสซิงเกิลและส่งผ่านไปยังเมธอด

  2. คลาสซิงเกิลไม่ จำกัด การสืบทอด

  3. เราไม่สามารถกำจัดวัตถุของคลาสสแตติก แต่สามารถคลาสเดี่ยว


อะไรคือการใช้การส่งซิงเกิลตันไปยังเมธอดหากมีเพียงหนึ่งเสมอและอันนั้นมีการอ้างอิงแบบสแตติกเสมอ?
Aaron Franke

3

ความแตกต่างจากคลาสสแตติก

JDK มีตัวอย่างของทั้งแบบซิงเกิลและแบบคงที่ในอีกด้านหนึ่งjava.lang.Mathเป็นคลาสสุดท้ายที่มีวิธีแบบคงที่ในทางกลับกันjava.lang.Runtimeเป็นคลาสแบบซิงเกิล

ข้อดีของซิงเกิลตัน

  • หากคุณต้องการรักษาสถานะมากกว่ารูปแบบซิงเกิลเป็นตัวเลือกที่ดีกว่าคลาสสแตติกเนื่องจากการรักษาสถานะในคลาสสแตติกจะนำไปสู่ข้อบกพร่องโดยเฉพาะอย่างยิ่งในสภาพแวดล้อมพร้อมกันที่อาจนำไปสู่สภาวะการแข่งขัน

  • Singleton class สามารถขี้เกียจได้ถ้ามันเป็นวัตถุที่หนัก แต่คลาส static นั้นไม่มีข้อดีดังกล่าวและมักจะโหลดอย่างกระตือรือร้น

  • ด้วย singleton คุณสามารถใช้การสืบทอดและ polymorphism เพื่อขยายคลาสฐานใช้อินเทอร์เฟซและให้การใช้งานที่แตกต่างกัน

  • เนื่องจากวิธีการคงที่ใน Java ไม่สามารถแทนที่ได้จึงนำไปสู่การไม่ยืดหยุ่น ในอีกทางหนึ่งคุณสามารถแทนที่วิธีการที่กำหนดในชั้นเรียนเดี่ยวโดยการขยายมัน

ข้อเสียของการเรียนแบบคงที่

  • เป็นการง่ายกว่าที่จะเขียนการทดสอบหน่วยสำหรับซิงเกิลตันมากกว่าคลาสสแตติกเนื่องจากคุณสามารถผ่านวัตถุจำลองเมื่อใดก็ตามที่คาดว่าจะเป็นซิงเกิล

ข้อดีของการเรียนแบบคงที่

  • คลาสสแตติกให้ประสิทธิภาพที่ดีกว่าซิงเกิลเนื่องจากเมธอดแบบสแตติกถูกผูกมัดกับเวลาคอมไพล์

รูปแบบซิงเกิลแต่ละอันมีข้อดีและข้อเสียแตกต่างกันไป

  • กระตือรือร้นโหลดซิงเกิลตัน
  • ล็อคเดี่ยวที่ตรวจสอบสองครั้ง
  • สำนวนการเริ่มต้นตามความต้องการเจ้าของ
  • ซิงเกิลอิง enum

คำอธิบายโดยละเอียดแต่ละคนนั้นละเอียดเกินไปดังนั้นฉันแค่ใส่ลิงค์ไปยังบทความที่ดี - สิ่งที่คุณอยากรู้เกี่ยวกับ Singleton


2

มีความแตกต่างอย่างมากระหว่างอินสแตนซ์คลาสแบบสแตติกเดี่ยว (นั่นคืออินสแตนซ์เดียวของคลาสซึ่งเกิดขึ้นเป็นตัวแปรแบบสแตติกหรือส่วนกลาง) และตัวชี้แบบสแตติกเดี่ยวไปยังอินสแตนซ์ของคลาสบนฮีป:

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


1
ดังนั้นหากออกจากแอปพลิเคชันแล้วซิงเกิลจะยังคงอยู่ในหน่วยความจำหรือไม่?
nanosoft

ฉันคิดว่าคุณหมายถึงเมื่อเธรดปัจจุบันของคุณออกจากแอปพลิเคชันใช่ไหม หากแอปพลิเคชันออกไปจะไม่มีวิธีให้เธรดอื่นใช้อะไรจากมัน
Tom Brito

2

ความแตกต่างในหัวของฉันคือการใช้การเขียนโปรแกรมเชิงวัตถุ (Singleton / Prototype) หรือการเขียนโปรแกรมฟังก์ชั่น (คงที่)

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

ในทางกลับกันคงที่จะใช้ในการใช้การเขียนโปรแกรมการทำงาน สมาชิกแบบคงที่อยู่ในชั้นเรียน พวกเขาไร้สัญชาติ

คุณทราบได้อย่างไรว่าคุณสามารถสร้างคลาสแบบคงที่แบบซิงเกิลตัน :)


อะไรคือจุดที่ส่งผ่านซิงเกิลตันเป็นพารามิเตอร์เนื่องจากมันจะมีการอ้างอิงแบบสแตติกบนคลาสเสมอ
Aaron Franke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.