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

จากวิกิพีเดีย สารานุกรมเสรี
(เปลี่ยนทางจาก Factory method pattern)

แบบแผนแฟกทอรีเมธอด (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 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)

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