เป็นดีไซน์แพตเทิร์น อีกแบบนึงที่ใช้สร้างอ็อบเจกต์ของคลาสชนิดหนึ่งๆ Factory Method ในความหมายโดยทั่วไปคือเมธอดที่ทำหน้าที่สร้างอ็อบเจกต์ โดยที่ไม่ใช้ constructor นั่นเอง
หากยังนึกไม่ออก
การสร้าง object แบบปกติ
ก็ให้นึกถึงการสร้าง object โดยที่ไม่ได้ new ดูสิครับจากปกติในการสร้าง object จาก class ที่ต้องการนั้นจะมีรูปแบบการเขียนตัวอย่างคือ
ชื่อclass ชื่อobject = new ชื่อclass () ;
เช่น Student objstu = new Student();
การสร้าง object แบบใช้ Factory Method
เอะจากข้างบนมันก็การสร้าง object ปกตินินา แล้วถ้าเป็น Factory Method มันจะสร้างobject ยังไงของมันละ เราลองมาดูตัวอย่าง
Student objstu = Cre.creFactory("red");
จากตัวอย่างข้างต้นจะเห็นได้ว่าเป็นการสร้าง object โดยไม่มีการ new แต่เป็นการเรียกmethod
ตัวหนึ่งแทนและมีการส่งค่าในการเลือกประเภทของการสร้าง ในที่นี้ส่งเป็น String คำว่า red เข้าไป
เรามาดู Class ของ java ที่ใช้ Factory Method ในการสร้างObject
1. Class SAXParserFactory
java.lang.Object
javax.xml.parsers.SAXParserFactoryDefines a factory API that enables applications to configure and obtain a SAX based parser to parse XML documents.
2. Class ColorChooserComponentFactory
java.lang.Object javax.swing.colorchooser.ColorChooserComponentFactoryA class designed to produce preconfigured "accessory" objects to insert into color choosers.
3. Class JFormattedTextField.AbstractFormatterFactory
java.lang.Object javax.swing.JFormattedTextField.AbstractFormatterFactory
Instances ofAbstractFormatterFactory
are used byJFormattedTextField
to obtain instances ofAbstractFormatter
which in turn are used to format values.
4. Class SAXTransformerFactory
java.lang.Object javax.xml.transform.TransformerFactory javax.xml.transform.sax.SAXTransformerFactoryThis class extends TransformerFactory to provide SAX-specific factory methods. It provides two types of ContentHandlers, one for creating Transformers, the other for creating Templates objects.
5. Class Calendar
Calendar rightNow = Calendar.getInstance();
ตัวอย่างของ Factory Method
interface Vehicle { public String move(); } public Car extends Vehicle { public String move() { System.out.println("run on the road."); } } public Aircraft extends Vehicle { public String move() { System.out.println("fly in the sky."); } } public VehicleFactory() { // duration คือเวลาที่ใช้ในการเดินทางเป็น ชม. public static Vehicle createVehicle(int duration) { if (duration > 15) return new Car(); else return new Aircraft(); } }จาก code ด้านบนจะเห็นว่า หาคลาสใดต้องการเอายานพาหนะไปใช้สามารถที่จะสร้างยานพาหนะตรงๆ ก็ได้ แต่ก็ต้องเอาข้อกำหนดเรื่องเวลากระจายไปตามคลาสต่างๆ เหล่านั้นด้วย หาก มีการเพิ่มยานพาหนะอีกอย่างขึ้นมา ก็ต้องไปแก้โค้ดในคลาสต่างๆ ที่ใช้ยานพาหนะทั้งหมด หากรวมโค้ดเหล่านั้นไว้ที่จุดเดียวคือ คลาสที่ใช้ในการสร้าง เวลาแก้ไขก็สามารถแก้ไขจุดเดียวได้คือที่ Factory ไม่จำเป็นที่จะต้องแก้ไขตามคลาสต่างๆ อีกต่อไป ทีนี้ก็ลองใช้กันดูน่ะค่ะ
reference : http://download.oracle.com/javase/1.4.2/docs/api/overview-summary.html
คือจริง ๆ อยากให้ลองค้นว่ามีคลาสใดของ Java บ้าง ยกตัวอย่างมาสักสองคลาส ที่ให้เราสร้างออบเจกต์โดยใช้ Factory method
ตอบลบอ้อแล้วก็มีการ copy and paste ด้วย ไม่ได้นะครับ
ตอบลบ