คำจำกัดความรูปแบบจากโรงงาน: จัดเตรียมอินเทอร์เฟซสำหรับการสร้างวัตถุ
ทำไมต้องใช้โหมดโรงงาน
แบบจำลองโรงงานเป็นรูปแบบที่ใช้กันมากที่สุดที่เราใช้
เหตุใดแบบจำลองโรงงานจึงใช้กันทั่วไป? เนื่องจากรูปแบบของโรงงานเทียบเท่ากับการสร้างวัตถุอินสแตนซ์ใหม่เรามักจะต้องสร้างวัตถุอินสแตนซ์ตามคลาสคลาส ต้องระวังให้มากขึ้น
ลองใช้คลาสตัวอย่างเป็นตัวอย่าง
การคัดลอกรหัสมีดังนี้:
ตัวอย่างตัวอย่าง = ตัวอย่างใหม่ ();
อย่างไรก็ตามความจริงก็คือเรามักจะทำงานเริ่มต้นบางอย่างเมื่อสร้างอินสแตนซ์ตัวอย่างเช่นฐานข้อมูลการสืบค้นที่ได้รับมอบหมาย ฯลฯ
ก่อนอื่นสิ่งที่เราคิดคือเราสามารถใช้ตัวสร้างตัวอย่างเพื่อให้อินสแตนซ์ถูกสร้างและเขียนเป็น:
การคัดลอกรหัสมีดังนี้:
ตัวอย่างตัวอย่าง = ตัวอย่างใหม่ (พารามิเตอร์);
อย่างไรก็ตามหากการเริ่มต้นงานที่ทำเมื่อสร้างอินสแตนซ์ตัวอย่างไม่ง่ายเหมือนการกำหนดมันอาจเป็นรหัสที่ยาวนาน
ทำไมผู้เริ่มต้นจึงไม่ได้รับความรู้สึกนี้? วิธีการเทียบเท่ากับการวางไข่จำนวนมาก การส่งรหัสยาวลงในแต่ละเซ็กเมนต์และเซ็กเมนต์คือ "ห่อหุ้ม" อีกครั้ง (ลดการเชื่อมต่อการเชื่อมต่อระหว่างเซ็กเมนต์) เพื่อให้ความเสี่ยงจะมีความหลากหลาย ไม่มีสิ่งใดที่จะส่งผลกระทบต่อแต่ละส่วน
ในตัวอย่างนี้ก่อนอื่นเราจำเป็นต้องแยกงานของการสร้างอินสแตนซ์จากงานของการใช้อินสแตนซ์นั่นคือแยกงานเริ่มต้นจำนวนมากที่จำเป็นในการสร้างอินสแตนซ์จากตัวสร้างตัวอย่าง
ในเวลานี้เราต้องการรูปแบบโรงงานในโรงงานเพื่อสร้างวัตถุและเราไม่สามารถใช้ตัวอย่างใหม่ง่ายๆ (พารามิเตอร์) อีกต่อไป นอกจากนี้หากตัวอย่างมีมรดกเช่นตัวอย่าง mysample ตามการเขียนโปรแกรมที่เน้นอินเทอร์เฟซเราจำเป็นต้องใช้ตัวอย่างนามธรรมลงในอินเทอร์เฟซ ตอนนี้ตัวอย่างเป็นอินเทอร์เฟซที่มีสองคลาสย่อยตัวอย่างและตัวอย่าง เมื่อเราต้องการยกตัวอย่างพวกเขาดังนี้:
การคัดลอกรหัสมีดังนี้:
ตัวอย่าง mysample = mysample ใหม่ ();
ในขณะที่โครงการลึกซึ้งยิ่งขึ้นตัวอย่างอาจ "นำลูกชายจำนวนมากออกมา" ดังนั้นเราจำเป็นต้องสร้างอินสแตนซ์ลูกชายเหล่านี้ทีละคน หลีกเลี่ยงไม่ได้ในโปรแกรมดั้งเดิม
แต่ถ้าคุณใช้แบบจำลองโรงงานอย่างมีสติตั้งแต่ต้นปัญหาเหล่านี้หายไป
วิธีโรงงาน
คุณจะสร้างโรงงานที่เชี่ยวชาญในการผลิตอินสแตนซ์ตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
โรงงานชั้นเรียนสาธารณะ {
ผู้สร้างตัวอย่างแบบคงที่สาธารณะ (int ซึ่ง) {
// getClass สร้างตัวอย่างโดยทั่วไปการโหลดคลาสแบบไดนามิกสามารถใช้ในการโหลดคลาส
ถ้า (ซึ่ง == 1)
ส่งคืน samplea ใหม่ ();
อื่นถ้า (ซึ่ง == 2)
ส่งคืนตัวอย่างใหม่ ();
-
-
จากนั้นในโปรแกรมของคุณหากคุณต้องการตัวอย่างให้ใช้รหัสคัดลอกรหัสดังนี้:
ตัวอย่าง samplea = factory.creator (1);
ด้วยวิธีนี้ subclass เฉพาะของตัวอย่างไม่ได้เกี่ยวข้องกับกระบวนการทั้งหมด ยิ่งทำผิดพลาดได้ง่ายขึ้น ทุกคนที่ทำงานเฉพาะมีความเข้าใจอย่างลึกซึ้งในสิ่งนี้ ดูเหมือนว่าเราสามารถเข้าใจหลักการของชีวิตจากการเขียนโปรแกรมได้หรือไม่?
ใช้วิธีการโรงงานเพื่อให้ความสนใจกับหลายบทบาท เพื่อสร้างตัวอย่างผลิตภัณฑ์ดังแสดงในรูปด้านล่าง
เพื่อให้มีความซับซ้อนมากขึ้นมันคือการขยายในคลาสโรงงานซึ่งสืบทอดการดำเนินงานคอนกรีตที่มีการใช้งาน
โรงงานนามธรรม
แบบจำลองโรงงานรวมถึง: วิธีการเป็นโรงงานและโรงงานนามธรรม
ความแตกต่างระหว่างสองรูปแบบนี้อยู่ในความซับซ้อนของการสร้างวัตถุ หากวิธีการของเราในการสร้างวัตถุมีความซับซ้อนเช่นเดียวกับในวิธีการโรงงานข้างต้นมันคือการสร้างตัวอย่างวัตถุหากเรามีตัวอย่างอินเทอร์เฟซผลิตภัณฑ์ใหม่ 2
สมมติว่านี่: ตัวอย่างมีสองคลาสคอนกรีต Samplea และ Samleb และ Sample2 ยังมีสองคลาสคอนกรีตตัวอย่าง 2A และ SampleB2 การใช้งาน subclass ของชิ้นส่วนที่แตกต่างกันต่อไปนี้คือการขยายโรงงานในตัวอย่างข้างต้นไปยังโรงงานนามธรรม:
การคัดลอกรหัสมีดังนี้:
โรงงานคลาสนามธรรมสาธารณะ {
ผู้สร้างตัวอย่างนามธรรมสาธารณะ ();
ตัวอย่างบทคัดย่อสาธารณะ 2 ผู้สร้าง (ชื่อสตริง);
-
Public Class SimpleFactory ขยายโรงงาน {
ผู้สร้างตัวอย่างสาธารณะ () {......... ส่งคืน Samplea ใหม่}
ตัวอย่างสาธารณะ 2 ผู้สร้าง (ชื่อสตริง) {......... กลับตัวอย่างใหม่ 2a}
-
Bombfactory ระดับสาธารณะขยายโรงงาน {
ผู้สร้างตัวอย่างสาธารณะ () {...... ส่งคืนตัวอย่างใหม่}
ตัวอย่างสาธารณะ 2 ผู้สร้าง (ชื่อสตริง) {...... ส่งคืนตัวอย่างใหม่ 2B}
-
จากข้างต้นโรงงานทั้งสองแต่ละชุดสร้างชุดตัวอย่างและตัวอย่าง 2
มีอีกจุดสำคัญในโรงงานนามธรรมเนื่องจากมีการเชื่อมต่อบางอย่างระหว่างวิธีการที่สร้างตัวอย่างและตัวอย่าง 2 ใน SimpleFactory ดังนั้นวิธีการทั้งสองนี้จะต้องรวมเข้าด้วยกัน กระบวนการเป็นแบบรวมตัวอย่างเช่นกระบวนการผลิตค่อนข้างง่ายดังนั้นชื่อจึงเป็นเรื่องง่าย
ในการใช้งานจริงวิธีการโรงงานถูกใช้บ่อยขึ้นและรวมกับรถตักคลาสแบบไดนามิก
ตัวอย่างของแบบจำลองโรงงาน Java
ลองใช้ฟอรั่มของ Jive เป็นตัวอย่าง
การคัดลอกรหัสมีดังนี้:
ForumFactory คลาสนามธรรมสาธารณะ {
INTLOCH OBJECT ส่วนตัว = New Object ();
สาธารณะฟอรัมแฟคเตอร์คงที่ GetInstance (การอนุญาตอนุญาต) {
// หากไม่มีการอนุญาตที่ถูกต้องส่งคืนค่า null
if (การอนุญาต == null) {return null;
// ต่อไปนี้ใช้โหมด Singleton Singleton
ถ้า (โรงงาน == null) {
ซิงโครไนซ์ (initlock) {
ถ้า (โรงงาน == null) {......
พยายาม {
// การพิมพ์ซ้ำแบบไดนามิก
คลาส C = class.forName (className);
Factory = (ForumFactory) C.NewInstance ();
} catch (exception e) {return null;
-
-
-
// ตอนนี้ส่งคืนพร็อกซี
ส่งคืน ForumFactoryProxy ใหม่ (การอนุญาต, โรงงาน, Factory.GetPermissions (การอนุญาต));
-
// วิธีการสร้างฟอรัมเสร็จสมบูรณ์โดยคลาสย่อยที่สืบทอด ForumFactory
ฟอรัมนามธรรมสาธารณะ CreateForum (ชื่อสตริง, คำอธิบายสตริง)
โยน unauidizedexception, forumalreadyExistsexception;
-
-
เนื่องจากตอนนี้ Jive จัดเก็บโพสต์ฟอรัมและข้อมูลเนื้อหาอื่น ๆ ผ่านระบบฐานข้อมูลหากคุณต้องการเปลี่ยนเพื่อนำไปใช้ผ่านระบบไฟล์วิธีการโรงงานนี้ ForumFactory จึงให้อินเทอร์เฟซแบบไดนามิก:
การคัดลอกรหัสมีดังนี้:
สตริงคงที่ส่วนตัว className = "com.jivesoftware.forum.database.dbforumfactory";
คุณสามารถใช้วิธีการที่คุณพัฒนาขึ้นเพื่อสร้างฟอรัมแทน com.jivesoftware.forum.database.dbforumfactory
ในรหัสข้างต้นมีสามโหมด Access Forum: หนึ่งถ้าคุณเป็นผู้ใช้ที่ลงทะเบียนและแขกผู้เข้าพักการอนุญาตที่สอดคล้องกันจะแตกต่างกันและการอนุญาตนี้จะดำเนินการผ่านระบบทั้งหมด
ตรวจสอบ catalogdaofactory ในร้านขายสัตว์เลี้ยง Java:
การคัดลอกรหัสมีดังนี้:
คลาสสาธารณะ catalogdaofactory {
-
* วิธีนี้พัฒนาคลาสย่อยพิเศษเพื่อใช้รูปแบบ DAO
* คำจำกัดความของคลาสย่อยเฉพาะอยู่ในตัวอธิบายการปรับใช้ J2EE
-
catalogdao public catalogdao getdao () พ่น catalogdaosysexception {
catalogdao catdao = null;
พยายาม {
INTIALCONTEXT IC = new InitialContext ();
// การโหลดแบบไดนามิกของ catalog_dao_class
// คุณสามารถกำหนด catalog_dao_class ของคุณเองเพื่อที่คุณจะได้ไม่ต้องเปลี่ยนรหัสมากเกินไป
// ดำเนินการเปลี่ยนแปลงระบบขนาดใหญ่ให้เสร็จสมบูรณ์
String className = (String) IC.Lookup (jnDinames.catalog_dao_class);
catdao = (catalogdao) class.forname (classname) .newinstance ();
} catch (namingException ne) {
โยน catalogdaosysexception ใหม่ ("catalogdaofactory.getdao: namingexception ในขณะที่ได้รับ dao type: /n" + ne.getMessage ());
} catch (Exception SE) {
โยน catalogdaosysexception ใหม่ ("catalogdaofactory.getdao: ข้อยกเว้นในขณะที่ได้รับประเภท dao: /n" + se.getMessage ());
-
กลับ Catdao;
-
-
Catalogdaofactory เป็นวิธีการทั่วไปของโรงงาน . ใช้คลาสย่อยและตั้งชื่อคลาสย่อยของคุณเองกับตัวแปร catalog_dao_class
จะเห็นได้ว่าวิธีการโรงงานนั้นให้กลไกการขยายตัวแบบไดนามิกที่ยืดหยุ่นและทรงพลังสำหรับโครงสร้างระบบ เป็นไปได้ที่จะเปลี่ยนฟังก์ชั่นระบบในการแปลง