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

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

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

สารบัญ

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

UML โครงสร้างของเทมเพลทเมธอด
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)

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