Java: รูปแบบวิธีการออกแบบโรงงาน | การออกแบบเชิงวัตถุ | รูปแบบการออกแบบ
เผยแพร่แล้ว: 2013-06-28 Factory Design Pattern เป็นหนึ่งในรูปแบบ Creational Design และมีการใช้กันอย่างแพร่หลายใน JDK เช่นเดียวกับเฟรมเวิร์ก เช่น Spring MVC และ Struts รูปแบบวิธีการของโรงงาน คือรูปแบบการออกแบบเชิงสร้างสรรค์เชิงวัตถุเพื่อใช้แนวคิดของโรงงานและจัดการกับปัญหาในการสร้างวัตถุ (ผลิตภัณฑ์) โดยไม่ระบุประเภทที่แน่นอนของวัตถุที่จะสร้างขึ้น แก่นแท้ของรูปแบบนี้คือ " กำหนดอินเทอร์เฟซสำหรับการสร้างวัตถุ แต่ให้คลาสที่ใช้อินเทอร์เฟซตัดสินใจว่าจะสร้างอินสแตนซ์ของคลาสใด เมธอด Factory อนุญาตให้คลาสเลื่อนการสร้างอินสแตนซ์ไปยังคลาสย่อย "
มาเรียนรู้วิธีใช้งานรูปแบบโรงงานใน java กันก่อน เราจะสร้าง 5 คลาสเพื่อใช้รูปแบบนี้
- ซูเปอร์คลาส (CrunchfiyCompany.java)
- ซูเปอร์คลาสในรูปแบบโรงงานสามารถเป็นอินเตอร์เฟส คลาสนามธรรม หรือคลาสจาวาปกติ สำหรับตัวอย่างของเรา เรามี super class เป็น abstract class ที่มีเมธอด
toString()
แทนที่เพื่อการทดสอบ
- ซูเปอร์คลาสในรูปแบบโรงงานสามารถเป็นอินเตอร์เฟส คลาสนามธรรม หรือคลาสจาวาปกติ สำหรับตัวอย่างของเรา เรามี super class เป็น abstract class ที่มีเมธอด
- คลาสย่อย1 (CrunchifyEbay.java)
- ขอให้สังเกตว่าคลาสกำลังขยายคลาส CrunchfiyCompany
- คลาสย่อย2 (CrunchifyGoogle.java)
- ขอให้สังเกตว่าคลาสกำลังขยายคลาส CrunchfiyCompany
- คลาสโรงงาน (CrunchifyFactoryPattern.java)
- ตอนนี้เรามี super class และ sub-class พร้อมแล้ว เราก็สามารถเขียน factory class ของเราได้
- เราสามารถเก็บ Factory class Singleton หรือเราสามารถเก็บ method ที่คืนค่า subclass เป็นแบบสแตติก
- โปรดสังเกตว่าตามพารามิเตอร์อินพุต คลาสย่อยที่แตกต่างกันจะถูกสร้างขึ้นและส่งคืน
- คลาสทดสอบ (CrunchifyFactoryPatternTest.java)
- โปรแกรมไคลเอนต์ทดสอบอย่างง่ายที่ใช้การนำรูปแบบโรงงานไปใช้ข้างต้น
อื่นๆ ต้องอ่าน:
- เธรดที่ปลอดภัยและการใช้งาน Singleton ที่รวดเร็วใน Java
- Daemon Thread ใน Java คืออะไร? ตัวอย่างที่แนบมา
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Super class in factory pattern can be an interface, abstract class or a // normal java class. For our example, we have super class as abstract class // with overridden toString() method for testing purpose. public abstract class CrunchfiyCompany { public abstract String getPhoneNumber ( ) ; public abstract String getZipCode ( ) ; @Override public String toString ( ) { return "Phone #= " + this . getPhoneNumber ( ) + ", Zip Code= " + this . getZipCode ( ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyEbay extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyEbay ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyGoogle extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyGoogle ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyEbay ; import com . crunchify . tutorials . CrunchifyGoogle ; /** * @author Crunchify.com */ // Now that we have super classes and sub-classes ready, we can write our factory class. // We can keep Factory class Singleton or we can keep the method that return the subclass a static. // Notice that based on the input parameter, different subclass is created and returned. public class CrunchifyFactoryPattern { public static CrunchfiyCompany getDetails ( String type , String phoneNumber , String zipCode ) { if ( "Ebay" . equalsIgnoreCase ( type ) ) return new CrunchifyEbay ( phoneNumber , zipCode ) ; else if ( "Google" . equalsIgnoreCase ( type ) ) return new CrunchifyGoogle ( phoneNumber , zipCode ) ; return null ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyFactoryPattern ; /** * @author Crunchify.com */ // Simple Test client program that uses above factory pattern implementation. public class CrunchifyFactoryPatternTest { public static void main ( String [ ] args ) { CrunchfiyCompany eBay = CrunchifyFactoryPattern . getDetails ( "Ebay" , "408.123.4567" , "98765" ) ; CrunchfiyCompany google = CrunchifyFactoryPattern . getDetails ( "Google" , "519.123.4567" , "56789" ) ; System . out . println ( "Factory eBay Config::" + eBay ) ; System . out . println ( "Factory Google Config::" + google ) ; } } |
1 2 |
Factory eBay Config : : Phone #= 408.123.4567, Zip Code= 98765 Factory Google Config : : Phone #= 519.123.4567, Zip Code= 56789 |
ตัวอย่างอื่นๆ โดยใช้รูปแบบโรงงาน?
- วิธี java.util.Calendar, ResourceBundle และ NumberFormat
getInstance()
ใช้รูปแบบโรงงาน -
valueOf()
ในคลาส wrapper เช่น Boolean, Integer เป็นต้น
ประโยชน์ของรูปแบบโรงงาน:
- มันถูกใช้เมื่อเรามี super class ที่มี sub-class หลายตัว และขึ้นอยู่กับ input เราจำเป็นต้องคืนค่า sub-class ตัวใดตัวหนึ่ง รูปแบบนี้นำความรับผิดชอบในการสร้างอินสแตนซ์ของคลาสออกจากโปรแกรมไคลเอนต์ไปจนถึงคลาสโรงงาน
- รูปแบบโรงงานให้แนวทางในการโค้ดสำหรับส่วนต่อประสานมากกว่าการนำไปใช้
- รูปแบบโรงงานจะลบอินสแตนซ์ของคลาสการใช้งานจริงออกจากโค้ดไคลเอ็นต์ ทำให้มีประสิทธิภาพมากขึ้น เชื่อมต่อน้อยลง และขยายได้ง่าย ตัวอย่างเช่น เราสามารถเปลี่ยนแปลงการใช้งานคลาส PC ได้อย่างง่ายดาย เนื่องจากโปรแกรมไคลเอนต์ไม่ทราบเรื่องนี้
- รูปแบบโรงงานให้นามธรรมระหว่างการใช้งานและคลาสไคลเอนต์ผ่านการสืบทอด
ข้อเสีย:
- โรงงานจะต้องใช้สำหรับตระกูลวัตถุ หากคลาสไม่ขยายคลาสพื้นฐานหรืออินเตอร์เฟสทั่วไป คลาสเหล่านี้จะไม่สามารถใช้ได้ในเทมเพลตการออกแบบจากโรงงาน
รายชื่อ Java Web Development, บทช่วยสอน Spring MVC ทั้งหมด