คุณเคยต้องการสร้างคลาสที่มีเพียงอินสแตนซ์เดียวเท่านั้นหรือไม่
ใช่? ไม่? อาจจะ?
ก็…
นั่นคือสิ่งที่รูปแบบซิงเกิลตัน คือ.
ไม่มีปัญหากับสิ่งนั้น
แต่บางคนเรียกสิ่งนี้ว่าการต่อต้านรูปแบบเพราะสามารถใช้เป็นข้ออ้างสำหรับการออกแบบที่ไม่ดีได้
มาดูตัวอย่างโค้ดเพื่อเรียนรู้วิธีใช้งาน
ตัวอย่างโค้ดรูปแบบซิงเกิลตัน
แนวคิดของรูปแบบซิงเกิลตันคือคุณต้องการคลาสที่มีอินสแตนซ์เดียวเท่านั้น
ตามนี้ :
- คุณสร้าง
new
วิธีการส่วนตัว - คุณกำหนดวิธีการเรียนชื่อ
instance
ที่ส่งคืนอินสแตนซ์เฉพาะสำหรับคลาส
เนื่องจากเป็นรูปแบบการออกแบบยอดนิยม ไลบรารีมาตรฐาน Ruby จึงมาพร้อมกับ Singleton
โมดูลที่คุณสามารถรวมไว้ในชั้นเรียนใดก็ได้
หน้าตาเป็นแบบนี้ :
require 'singleton' class Shop include Singleton end
ตอนนี้ถ้าคุณพยายามสร้าง Shop
วัตถุที่มี Shop.new
คุณจะเห็นสิ่งนี้:
Shop.new # NoMethodError: private method `new' called for Shop:Class
และถ้าอยากได้ Shop
. ที่เดียวเท่านั้น วัตถุที่คุณสามารถใช้ instance
วิธีการ:
Shop.instance.object_id # 5659218 Shop.instance.object_id # 5659218
คุณสามารถบอกได้ว่ามันเป็นวัตถุเดียวกันเสมอเพราะ object_id
ไม่เปลี่ยนแปลง
สิ่งที่คุณต้องจำไว้ :
นี่เป็นรูปแบบที่เรียบง่าย โดยจำกัดการสร้างวัตถุไว้ที่ 1 รายการ และคุณสามารถขอวัตถุนั้นได้ทุกเมื่อที่ต้องการ
ทำไมคุณไม่ควรใช้รูปแบบนี้
รูปแบบซิงเกิลตันมักเป็นข้ออ้างที่จะมีรูปแบบของตัวแปรส่วนกลางบางรูปแบบ และเรารู้ว่าตัวแปรส่วนกลางไม่ดีเพราะคุณไม่สามารถควบคุมได้ ทำให้การทดสอบยากขึ้นและสามารถเพิ่มการมีเพศสัมพันธ์ได้
“ปัญหาที่แท้จริงของ Singletons คือพวกเขาให้ข้อแก้ตัวที่ดีกับคุณที่จะไม่คิดอย่างรอบคอบเกี่ยวกับการมองเห็นที่เหมาะสมของวัตถุ” – เคนท์ เบ็ค
ลองนึกภาพการมีออบเจ็กต์ที่คลาสส่วนใหญ่ของคุณพึ่งพา นั่นคือสิ่งที่รูปแบบซิงเกิลตันสามารถเป็นได้ ขอให้โชคดีในการปรับโครงสร้างใหม่!
ตอนนี้ :
มีประโยชน์สำหรับรูปแบบนี้หรือไม่
การค้นหาบน Github เปิด repos บางส่วนโดยใช้รูปแบบ Singleton ร่วมกับรูปแบบวัตถุ Null
ฉันเดาว่ามันสมเหตุสมผลแล้ว Rails ใช้สิ่งนี้เป็นส่วนหนึ่งของ ActionPack
นี่คือรหัส :
class AllType < Type include Singleton def initialize super "*/*", :all end def all?; true; end def html?; true; end end
นี่คือคลาสที่สืบทอดมาจาก Type
.
เมื่อคุณสร้าง AllType
วัตถุผ่าน instance
เมธอด มันจะเรียก super &ส่งคืนอ็อบเจ็กต์
ทุกครั้งที่โทร instance
หลังจากนั้นคุณจะได้ของเดิม
โดยสรุป :
ใช่ รูปแบบนี้อาจมีประโยชน์ในสถานการณ์ที่เหมาะสม แต่คุณไม่ต้องการใช้รูปแบบนี้โดยไม่ได้คิดมาก
วิดีโอ
สรุป
คุณได้เรียนรู้เกี่ยวกับรูปแบบการออกแบบซิงเกิลตัน วิธีนำไปใช้ใน Ruby และเหตุผลที่คุณควรหลีกเลี่ยงเป็นส่วนใหญ่
คุณคิดอย่างไรเกี่ยวกับรูปแบบนี้? คุณเคยเห็นมันมาก่อนหรือไม่? แจ้งให้เราทราบในความคิดเห็น 🙂
ขอบคุณสำหรับการอ่าน!