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

องค์ประกอบของแฟคตอรี่เมธอดแพตเทิร์นมีดังนี้
- ผลิตภัณฑ์ (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)
[แก้] แหล่งข้อมูลอื่น
- Factory Method โดย Vince Huston ((อังกฤษ))