ในสถานการณ์เช่นนี้ฉันได้แนะนำ (บริบท) คำว่า "บริบท" ที่มีบางเลเยอร์หลายครั้งสำเร็จแล้ว
นี่หมายถึงซิงเกิลตันซึ่งเป็นที่เก็บอ็อบเจ็กต์ "โกลบอล" ซึ่งสามารถร้องขออ็อบเจ็กต์เหล่านี้ได้ รหัสที่ต้องมีรวมส่วนหัวของร้านค้าและใช้ฟังก์ชันส่วนกลางเพื่อรับอินสแตนซ์ของวัตถุ (เช่นตอนนี้ผู้ให้บริการอัตราดอกเบี้ย)
ร้านค้าอาจเป็นได้ทั้ง:
- พิมพ์อย่างเคร่งครัด: คุณรวมส่วนหัวสำหรับประเภทที่ให้บริการทั้งหมดและเพื่อให้คุณสามารถสร้าง accessors ที่พิมพ์เช่น InterestRate getCurrentInterestRate ();
- or generic: Object getObject (enum obType); และขยาย obType enum ด้วยชนิดใหม่เท่านั้น (obtypeCurrentInterestRate)
ยิ่งระบบมีขนาดใหญ่เท่าใดยิ่งใช้ประโยชน์ได้มากขึ้นเท่านั้น แต่สำหรับความเสี่ยงในการใช้ enum ที่ไม่ถูกต้อง ในทางกลับกันด้วยภาษาที่อนุญาตการประกาศประเภทไปข้างหน้าฉันคิดว่าคุณสามารถใช้ accessors ที่พิมพ์โดยไม่ต้องรวมส่วนหัวทั้งหมดในร้าน
อีกหนึ่งหมายเหตุ: คุณอาจมีประเภทวัตถุเดียวกันหลายครั้งสำหรับการใช้งานที่แตกต่างกันเช่นบางครั้งค่าภาษาที่แตกต่างกันสำหรับ GUI และสำหรับการพิมพ์บันทึกระดับโลกและเซสชั่น ฯลฯ ดังนั้นชื่อ enum / accessor ไม่ควรสะท้อนถึงประเภทจริง แต่บทบาทของอินสแตนซ์ที่ร้องขอ (CurrentInterestRate)
ในการใช้งานร้านค้าคุณต้องจัดการระดับบริบทและการรวบรวมอินสแตนซ์บริบท ตัวอย่างง่ายๆคือเว็บเซอร์วิสที่คุณมีบริบทส่วนกลาง (หนึ่งอินสแตนซ์สำหรับคำขอทั้งหมดสำหรับวัตถุนั้น - เป็นปัญหาเมื่อมีเซิร์ฟเวอร์ฟาร์ม) และบริบทสำหรับแต่ละเซสชันของเว็บ คุณยังสามารถมีบริบทสำหรับผู้ใช้แต่ละคนที่อาจมีหลายเซสชันแบบขนาน ฯลฯ ด้วยเซิร์ฟเวอร์หลายเครื่องคุณควรใช้แคชแบบกระจายสำหรับสิ่งต่าง ๆ
เมื่อคำขอเข้ามาคุณจะต้องตัดสินใจว่าวัตถุที่ร้องขอนั้นอยู่ในระดับบริบทใดรับบริบทนั้นสำหรับการโทร หากวัตถุอยู่ที่นั่นคุณส่งมันกลับมา; ถ้าไม่คุณสร้างและเก็บในระดับบริบทนั้นและส่งคืน แน่นอนประสานส่วนการสร้าง (และเผยแพร่ไปยังแคชกระจาย) การสร้างสามารถกำหนดค่าปลั๊กอินเหมือนได้ดีที่สุดกับภาษาที่อนุญาตให้สร้างอินสแตนซ์ของวัตถุด้วยชื่อคลาส (Java, Objective C, ... ) แต่คุณสามารถทำได้ใน C เช่นกันกับไลบรารีแบบเสียบได้ที่มีฟังก์ชั่นจากโรงงาน
หมายเหตุด้านข้าง: ผู้โทรไม่ควรรู้มากเกินไปเกี่ยวกับบริบทของตนเองและระดับบริบทของวัตถุที่ร้องขอ เหตุผล: 1: ง่ายต่อการทำผิดพลาด (หรือ "กลอุบายฉลาด") โดยการเล่นกับพารามิเตอร์เหล่านี้ 2: ระดับบริบทของการร้องขออาจเปลี่ยนแปลงในภายหลัง ฉันส่วนใหญ่เชื่อมต่อข้อมูลบริบทกับเธรดดังนั้นที่เก็บอ็อบเจ็กต์มีข้อมูลโดยไม่มีพารามิเตอร์เพิ่มเติมจากคำขอ
ในทางกลับกันคำขออาจมีคำใบ้สำหรับอินสแตนซ์: เช่นรับอัตราดอกเบี้ยสำหรับวันที่ระบุ มันควรจะเป็นการเข้าถึง "ทั่วโลก" ที่เหมือนกัน แต่มีหลายอินสแตนซ์ขึ้นอยู่กับวันที่ (และนำค่าวันที่ที่แตกต่างไปยังอินสแตนซ์เดียวกันระหว่างการเปลี่ยนแปลงอัตรา) ดังนั้นขอแนะนำให้เพิ่มวัตถุ "ใบ้" ลงในคำขอ โรงงานตัวอย่างและไม่ใช่ร้านค้า; และกุญแจสำหรับคำแนะนำเกี่ยวกับโรงงานที่ใช้โดยร้านค้า คุณสามารถเพิ่มฟังก์ชั่นเหล่านี้ได้ในภายหลังฉันเพิ่งพูดถึง
สำหรับกรณีของคุณนี่คือ overkill ชนิดหนึ่ง (มีเพียงวัตถุเดียวเท่านั้นที่ให้บริการในระดับโลก) แต่สำหรับรหัสพิเศษที่ค่อนข้างเล็กและเรียบง่ายในตอนนี้คุณจะได้รับกลไกสำหรับความต้องการเพิ่มเติมที่ซับซ้อนกว่านี้
ข่าวดีอีกอย่าง: ถ้าคุณอยู่ใน Java คุณจะได้รับบริการนี้จาก Spring โดยไม่ต้องคิดมากฉันอยากอธิบายรายละเอียด