ในบางรหัสของฉันฉันมีโรงงานแบบคงที่เช่นนี้:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
ในระหว่างการตรวจสอบรหัสมันก็เสนอว่าควรจะเป็นซิงเกิลตันและฉีด ดังนั้นควรมีลักษณะดังนี้:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
บางสิ่งที่ควรเน้น:
- โรงงานทั้งสองไร้สัญชาติ
- ข้อแตกต่างระหว่างเมธอดคือขอบเขต (อินสแตนซ์ vs คงที่) การใช้งานเหมือนกัน
- Foo เป็นถั่วที่ไม่มีส่วนต่อประสาน
ข้อโต้แย้งที่ฉันได้รับจากการคงที่คือ:
- คลาสไร้สัญชาติดังนั้นจึงไม่จำเป็นต้องมีการยกตัวอย่าง
- ดูเหมือนเป็นธรรมชาติมากขึ้นที่จะสามารถเรียกใช้วิธีการคงที่กว่าที่จะต้องยกตัวอย่างโรงงาน
ข้อโต้แย้งสำหรับโรงงานในฐานะซิงเกิลคือ:
- มันเป็นการดีที่จะฉีดทุกอย่าง
- แม้จะไร้สัญชาติของโรงงานการทดสอบก็ง่ายขึ้นด้วยการฉีด (ง่ายต่อการเยาะเย้ย)
- มันควรจะล้อเลียนเมื่อทดสอบผู้บริโภค
ฉันมีปัญหาร้ายแรงบางอย่างกับวิธีการแบบซิงเกิลเนื่องจากดูเหมือนว่าจะแนะนำว่าไม่มีวิธีใดที่คงที่ มันก็ดูเหมือนว่าจะแนะนำว่าStringUtils
ควรจะห่อและฉีดสาธารณูปโภคเช่นซึ่งดูเหมือนโง่ สุดท้ายก็หมายความว่าฉันต้องล้อเลียนโรงงานในบางจุดซึ่งดูไม่ถูกต้อง ฉันคิดไม่ออกว่าจะต้องล้อเลียนโรงงานเมื่อไหร่
ชุมชนคิดอย่างไร ในขณะที่ฉันไม่ชอบวิธีการเดี่ยว แต่ฉันไม่ได้มีข้อโต้แย้งที่แข็งแกร่งมากกับมัน
DateTime
และFile
คลาสนั้นยากที่จะทดสอบด้วยเหตุผลเดียวกันทั้งหมด หากคุณมีคลาสเช่นที่กำหนดCreated
วันที่DateTime.Now
ใน Constructor คุณจะสร้างการทดสอบหน่วยด้วยวัตถุเหล่านี้สองตัวที่ถูกสร้างขึ้นจากกันได้อย่างไร 5 นาที สิ่งที่เกี่ยวกับปีออกจากกัน? คุณไม่สามารถทำได้ (โดยไม่ต้องทำงานมาก)
private
สตรัคเตอร์และgetInstance()
วิธีการหรือไม่? ขออภัยไม่มีตัวเลือก nit-สมควร!