แบบแผนแฟกทอรีเมธอด
หน้าตา
แบบแผนแฟกทอรีเมธอด (Factory method pattern) เป็นแบบแผนการออกแบบซอฟต์แวร์ที่นิยามเมธอดสำหรับสร้างอ็อบเจกต์ของคลาสชนิดหนึ่งๆ แต่ไม่ได้เจาะจงชนิดที่แน่นอน ซับคลาสเป็นผู้กำหนดเจาะจงว่าจะสร้างอ็อบเจกต์ของคลาสใด แฟกทอรีเมธอดในความหมายโดยทั่วไปคือเมธอดที่ทำหน้าที่สร้างอ็อบเจกต์นั่นเองแบบแผนแฟกทอรีเมธอดจะถูกใช้ร่วมกับแบบแผนเทมเพลตเมธอด (Template method pattern) โดยถูกเรียกใช้งานจากในเทมเพลตเมธอด
การนำไปใช้งาน
[แก้]องค์ประกอบของแบบแผนแฟกทอรีเมธอดมีดังนี้
- ผลิตภัณฑ์ (Product) นิยามอินเตอร์เฟสของของอ็อบเจกต์ที่แฟกทอรีเมธอดจะเป็นผู้สร้าง
- ผลิตภัณฑ์รูปธรรม (Concrete product) ตัวคลาสที่แท้จริงที่จะถูกสร้างโดยแฟกทอรีเมธอด
- คลาสนามธรรม (Abstract class) เป็นผู้กำหนดแฟกทอรีเมธอด โดยสร้างเป็นเมธอดนามธรรม (Abstract method)
- คลาสรูปธรรม (Concrete class) ซับคลาสของคลาสนามธรรม กำหนดรายละเอียดของแฟกทอรีเมธอดที่ถูกนิยามในคลาสแม่
ตัวอย่างโค้ด
[แก้]ภาษาจาวา
[แก้]ตัวอย่างโปรแกรมคำนวณหาปริมาตรของรูปทรงกระบอกซึ่งมีสูตรดังนี้
ปริมาตร = พื้นที่ฐาน * ความสูง
โดยที่
- แฟกทอรีเมธอดทำหน้าที่สร้างรูปวงกลม
- ปริมาตรของทรงกระบอกคือผลคูณของความสูงและพื้นที่ฐานจากรูปวงกลมที่ถูกสร้างโดยแฟกทอรีเมธอด
คลาสนามธรรม Container
นิยามแฟกทอรีเมธอด createBase()
getHeight()
และ getVolume()
ซึ่งเป็นเทมเพลตเมธอดมีรายละเอียดการคำนวณหาปริมาตร
public abstract class Container {
/**
* Factory method
*/
public abstract TwoDShape createBase();
public abstract double getHeight();
/**
* Template method
*/
public double getVolume() {
return createBase().getArea() * getHeight();
}
}
คลาสรูปธรรม Cylinder
สร้างรูปวงกลม Circle
ในแฟกทอรีเมธอด createBase()
public class Cylinder extends Container {
private double radius;
private double height;
public Cylinder(double radius, double height) {
this.radius = radius;
this.height = height;
}
@Override
public TwoDShape createBase() {
return new Circle(radius);
}
@Override
public double getHeight() {
return height;
}
}
คลาส TwoDShape
และ Circle
public interface TwoDShape {
public double getArea();
}
public class Circle implements TwoDShape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
}
อ้างอิง
[แก้]- Design Patterns: Elements of Reusable Object-Oriented Software (ISBN 0-201-63361-2) โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)
แหล่งข้อมูลอื่น
[แก้]- Factory Method โดย Vince Huston (อังกฤษ)
- Pattern Summaries: Factory Method เก็บถาวร 2007-08-24 ที่ เวย์แบ็กแมชชีน โดย Mark Grand (อังกฤษ)
- The Factory Method (Creational) Design Pattern โดย Gopalan Suresh Raj (อังกฤษ)
- Factory Method Pattern[ลิงก์เสีย] โดย OOSE Student (ไทย)