คุณจำความแตกต่างระหว่างรูปแบบนามธรรมจากโรงงานและรูปแบบวิธีการของโรงงานในรูปแบบการออกแบบได้อย่างไร
ตอบ 1:
รูปแบบการออกแบบโรงงาน:
- มันอยู่ภายใต้ Creational Design Pattern รูปแบบโรงงานบอกว่าการสร้างวัตถุจะถูกจัดการโดยคลาสอื่นโดยใช้ประเภทอินพุต
ข้อดี:
- มันช่วยให้ข้อต่อหลวม
ควรใช้รูปแบบการออกแบบจากโรงงานเมื่อใด
- รูปแบบการออกแบบจากโรงงานจะใช้เมื่อเรามีซูเปอร์คลาสที่มีหลายคลาสย่อยและขึ้นอยู่กับอินพุตเราต้องส่งคืนหนึ่งในคลาสย่อยตัวอย่าง: หากร้านอาหารให้บริการอาหาร Veg, Non-Veg และอาหารอิตาเลี่ยน รักษา VegFood, NonVegFood และ ItalianFood เป็นสามคลาสที่มี superclass คือ Food หากลูกค้าถามว่า "Veg" วิธีการของโรงงานจะส่งคืนคลาส "VegFood"
ตัวอย่าง:
ขั้นตอนที่ 1: สร้างคลาสนามธรรม "อาหาร" ซึ่งมีตัวแปรสองตัวที่เรียกว่า "billPerPerson" และ "รายการ"
อาหารชั้นนามธรรมสาธารณะ { ป้องกัน billPerPerson คู่; ชุดป้องกันรายการ; อาหารสาธารณะ (double billPerPerson) { this.billPerPerson = billPerPerson; this.items = new HashSet <> (); } getBill สาธารณะสองครั้ง () { คืนบิล } ชุดสาธารณะ getItems () { ส่งคืนรายการ; } }
ขั้นตอนที่ 2: สร้างคลาสคอนกรีตที่ขยายคลาสนามธรรม "อาหาร"
คลาส VegFood สาธารณะขยายอาหาร { VegFood สาธารณะ () { ซุปเปอร์ (100); Items.Add ( "เกียจคร้าน"); Items.Add ( "Dosa"); Items.Add ( "Vada"); } } NonVegFood ระดับสาธารณะขยายอาหาร { NonVegFood สาธารณะ () { ซุปเปอร์ (120); Items.Add ( "Biriyani"); items.add ("ไก่ 65"); } }
ขั้นตอนที่ 3: สร้าง FoodServer ซึ่งเป็นคลาส Factory เพื่อสร้างวัตถุสำหรับคอนกรีตตามข้อมูล:
FoodServer ระดับสาธารณะ { public static Food getFood (ประเภทอาหารของสตริง) { if (foodType.equals ("veg")) { ส่งคืน VegFood ใหม่ (); } ถ้าอื่น (foodType.equals ("ไม่ใช่ veg")) { ส่งคืน NonVegFood ใหม่ (); } อื่น { System.out.println ("เราไม่ได้ให้บริการ" + foodType); ส่งคืน null } } }
ขั้นตอนที่ 4: "ลูกค้า" ระดับหลักเพื่อรับอาหารที่ต้องการตามประเภทอาหาร
ลูกค้าระดับสาธารณะ { โมฆะคงที่สาธารณะหลัก (String [] args) { ลูกค้า food1Food = FoodServer.getFood ("veg"); System.out.println ( "Customer1"); System.out.println ("รายการ:" + customer1Food.getItems (). toString ()); System.out.println ("Bill:" + customer1Food.getBill ()); ลูกค้า food2Food = FoodServer.getFood ("ไม่ใช่ veg"); System.out.println ( "Customer1"); System.out.println ("รายการ:" + customer2Food.getItems (). toString ()); System.out.println ("Bill:" + customer2Food.getBill ()); } }
รูปแบบการออกแบบโรงงานนามธรรม:
- มันอยู่ภายใต้ Creational Design Pattern มันมีส่วนต่อประสานสำหรับการสร้างครอบครัวของวัตถุที่เกี่ยวข้องหรือขึ้นอยู่กับโดยไม่ต้องระบุชั้นคอนกรีตของพวกเขารูปแบบโรงงานกวางเป็นโรงงานสุดยอดที่จะคืนโรงงานที่ดีที่สุดตามอินพุตมันทำหน้าที่เป็นโรงงานของโรงงาน . มันทำให้ลูกค้าไม่สามารถรู้ได้ว่าโรงงานใดจะถูกส่งคืน
ตัวอย่างชีวิตจริง:
- พิจารณาโรงงานขนาดใหญ่ที่ผลิตสบู่โรงงานจะไม่ผลิตทุกสิ่งที่จำเป็นสำหรับสบู่มันจะมีโรงงานย่อยมากมายที่จะผลิต "แถบสบู่" "สบู่ห่อหุ้ม" และอื่น ๆ ทุกอย่างจะประกอบกัน โดยโรงงานหลัก
เมื่อใดควรใช้รูปแบบการออกแบบจากโรงงานบทคัดย่อ?
- ไคลเอนต์ควรเป็นอิสระจากวิธีการสร้างวัตถุและวัตถุคลาสใดที่ถูกสร้างขึ้นสิ่งนี้มีประโยชน์เมื่อวัตถุจำเป็นต้องสร้างขึ้นจากตระกูลคลาส
หมายเหตุ: มันอาจจะสับสนดังนั้นโปรดระวังวิดีโอที่ฉันฝังไว้ท้ายหน้านี้
ตัวอย่าง:
ขั้นตอนที่ 1:
- สร้างส่วนต่อประสานที่เรียกว่า "หลักสูตร"
หลักสูตรอินเตอร์เฟซสาธารณะ { ประชาชน String getCourseName (); }
ขั้นตอนที่ 2:
- สร้างคลาสที่เป็นรูปธรรมซึ่งใช้อินเตอร์เฟส "หลักสูตร"
ProgrammingCourse ชั้นเรียนสาธารณะใช้หลักสูตร { @แทนที่ ประชาชนสตริง getCourseName () { ส่งคืน "Java"; } } NonProgrammingCourse ระดับสาธารณะใช้หลักสูตร { @แทนที่ ประชาชนสตริง getCourseName () { ส่งคืน "DSP"; } }
ขั้นที่ 3:
- สร้างส่วนต่อประสานที่เรียกว่า "แหล่งที่มา"
อินเตอร์เฟซสาธารณะที่มา { String สาธารณะ getSourceName (); }
ขั้นที่ 4:
- สร้างคลาสรูปธรรมที่ใช้อินเทอร์เฟซ "แหล่งที่มา"
ออฟไลน์ระดับสาธารณะใช้แหล่งที่มา { @แทนที่ ประชาชนสตริง getSourceName () { ส่งคืน "หนังสือ"; } } คลาสสาธารณะออนไลน์ใช้แหล่งที่มา { @แทนที่ ประชาชนสตริง getSourceName () { ส่งคืน "YouTube"; } }
ขั้นตอนที่ 5:
- สร้างคลาสนามธรรม "SourceCourseFactory"
คลาสนามธรรมสาธารณะ SourceCourseFactory { Public abstract Source getSource (String sourceType); public abstract Course getCourse (String courseType); }
ขั้นตอนที่ 6:
- สร้างคลาสโรงงาน "CourseFactory" ที่ขยาย "SourceCourseFactory"
คลาสสาธารณะ CourseFactory ขยาย SourceCourseFactory { @แทนที่ public source getSource (String sourceType) { ส่งคืน null } @แทนที่ หลักสูตรสาธารณะ getCourse (ประเภทสตริง String) { ถ้า (courseType.equalsIgnoreCase ( "โปรแกรม")) { ส่งคืน ProgrammingCourse ใหม่ (); } อื่นถ้า (courseType.equalsIgnoreCase ("ไม่ใช่โปรแกรม") { ส่งคืน NonProgrammingCourse ใหม่ (); } อื่น { ส่งคืน null } } }
ขั้นตอนที่ 7:
- สร้างคลาสโรงงาน "SourceFactory" ที่ขยาย "SourceCourseFactory"
คลาสสาธารณะ SourceFactory ขยาย SourceCourseFactory { @แทนที่ public source getSource (String sourceType) { ถ้า (sourceType.equalsIgnoreCase ( "ออนไลน์")) { ส่งคืนออนไลน์ใหม่ (); } อื่นถ้า (sourceType.equalsIgnoreCase ("ออฟไลน์")) { ส่งคืนออฟไลน์ใหม่ (); } อื่น { ส่งคืน null } } @แทนที่ หลักสูตรสาธารณะ getCourse (ประเภทสตริง String) { ส่งคืน null } }
ขั้นตอนที่ 8:
- สร้างคลาสหลักที่เรียกคลาส Abstract Factory เพื่อรับออบเจ็กต์คลาส Factory จริงจากนั้นจะใช้อ็อบเจกต์นั้นสำหรับการดำเนินการอื่น ๆ
คลาสสาธารณะ ExampleMain { โมฆะคงที่สาธารณะหลัก (String [] args) { หลักสูตร SourceCourseFactory = FactoryCreator.getSourceCourseFactory ("หลักสูตร"); System.out.println (course.getCourse ( "โปรแกรม") getCourseName ().); SourceCourseFactory source = FactoryCreator.getSourceCourseFactory ("แหล่งที่มา"); System.out.println (source.getSource ( "ออนไลน์") getSourceName ().); } }
โพสต์เมื่อ 29-01-2020