แฟกทอรีเมธอดแพตเทิร์น

จากวิกิพีเดีย สารานุกรมเสรี

แฟกทอรีเมธอดแพตเทิร์น (Factory method pattern) เป็นดีไซน์แพตเทิร์นที่นิยามเมธอดสำหรับสร้างอ็อบเจกต์ของคลาสชนิดหนึ่งๆ แต่ไม่ได้เจาะจงชนิดที่แน่นอน ซับคลาสเป็นผู้กำหนดเจาะจงว่าจะสร้างอ็อบเจกต์ของคลาสใด แฟกทอรีเมธอดในความหมายโดยทั่วไปคือเมธอดที่ทำหน้าที่สร้างอ็อบเจกต์นั่นเอง แฟกทอรีเมธอดแพตเทิร์นจะถูกใช้ร่วมกับเทมเพลตเมธอดแพตเทิร์น (Template method pattern) โดยถูกเรียกใช้งานจากในเทมเพลตเมธอด

การนำไปใช้งาน[แก้]

UML โครงสร้างของเทมเพลตเมธอด

องค์ประกอบของแฟกทอรีเมธอดแพตเทิร์นมีดังนี้

  • ผลิตภัณฑ์ (Product) นิยามอินเตอร์เฟสของของอ็อบเจกต์ที่แฟกทอรีเมธอดจะเป็นผู้สร้าง
  • ผลิตภัณฑ์รูปธรรม (Concrete product) ตัวคลาสที่แท้จริงที่จะถูกสร้างโดยแฟกทอรีเมธอด
  • คลาสนามธรรม (Abstract class) เป็นผู้กำหนดแฟกทอรีเมธอด โดยสร้างเป็นเมธอดนามธรรม (Abstract method)
  • คลาสรูปธรรม (Concrete class) ซับคลาสของคลาสนามธรรม กำหนดรายละเอียดของแฟกทอรีเมธอดที่ถูกนิยามในคลาสแม่

ตัวอย่างโค้ด[แก้]

ภาษาจาวา[แก้]

ตัวอย่างโปรแกรมคำนวณหาปริมาตรของรูปทรงกระบอกซึ่งมีสูตรดังนี้

ปริมาตร = พื้นที่ฐาน * ความสูง

โดยที่

  • แฟกทอรีเมธอดทำหน้าที่สร้างรูปวงกลม
  • ปริมาตรของทรงกระบอกคือผลคูณของความสูงและพื้นที่ฐานจากรูปวงกลมที่ถูกสร้างโดยแฟกทอรีเมธอด

คลาสนามธรรม Container นิยามแฟกทอรีเมธอด createBase() getHeight() และ getVolume() ซึ่งเป็นเทมเพลตเมธอดมีรายละเอียดการคำนวณหาปริมาตร

public abstract class Container {
 
    /**
     * Factory mathod
     */
    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)

แหล่งข้อมูลอื่น[แก้]