แบบแผนแฟกทอรีเมธอด

แบบแผนแฟกทอรีเมธอด (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  โดย Mark Grand 
 The Factory Method (Creational) Design Pattern โดย Gopalan Suresh Raj 
 Factory Method Pattern โดย OOSE Student

หมวดหมู่:การเขียนโปรแกรม