คุณเคยต้องการสร้างคลาสที่มีเพียงอินสแตนซ์เดียวเท่านั้นหรือไม่
ใช่? ไม่? อาจจะ?
ก็…
นั่นคือสิ่งที่รูปแบบซิงเกิลตัน คือ.
ไม่มีปัญหากับสิ่งนั้น
แต่บางคนเรียกสิ่งนี้ว่าการต่อต้านรูปแบบเพราะสามารถใช้เป็นข้ออ้างสำหรับการออกแบบที่ไม่ดีได้
มาดูตัวอย่างโค้ดเพื่อเรียนรู้วิธีใช้งาน
ตัวอย่างโค้ดรูปแบบซิงเกิลตัน
แนวคิดของรูปแบบซิงเกิลตันคือคุณต้องการคลาสที่มีอินสแตนซ์เดียวเท่านั้น
ตามนี้ :
- คุณสร้าง
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 และเหตุผลที่คุณควรหลีกเลี่ยงเป็นส่วนใหญ่
คุณคิดอย่างไรเกี่ยวกับรูปแบบนี้? คุณเคยเห็นมันมาก่อนหรือไม่? แจ้งให้เราทราบในความคิดเห็น 🙂
ขอบคุณสำหรับการอ่าน!