เทมเพลทเมธอดแพตเทิร์น
จากวิกิพีเดีย สารานุกรมเสรี
เทมเพลตเมธอดแพตเทิร์น (Template method pattern) เป็นดีไซน์แพตเทิร์นที่ใช้กำหนดแม่แบบหรือโครงหลักของอัลกอริทึม โดยไม่ได้กำหนดรายละเอียดของขั้นตอนต่างๆ ซับคลาสสามารถนิยามรายละเอียดของแต่ละขั้นตอนย่อยได้ตามความต้องการ เทมเพลตเมธอดถูกใช้เป็นส่วนหลักของซอฟต์แวร์เฟรมเวิร์ก ตัวอย่างที่นอกเหนือจากการเขียนโปรแกรมเช่น แบบแปลนบ้านที่เจ้าของบ้านสามารถเลือกสีและตบแต่งได้ภายหลัง
เนื้อหา |
[แก้] การนำไปใช้งาน
องค์ประกอบของเทมเพลตเมธอดแพตเทิร์นมีดังนี้
- คลาสนามธรรม (Abstract class) เป็นผู้กำหนดโครงหลักในการทำงาน
- กำหนดขั้นตอนย่อยของการทำงานโดยไม่กำหนดรายละเอียด โดยสร้างเป็นเมธอดนามธรรม (Abstract method) หรืออาจจะกำหนดการทำงานพื้นฐานไว้ก็ได้
- สร้างเทมเพลตเมธอดที่มีโครงของอัลกอริทึมและเรียกใช้ขั้นตอนย่อยที่ได้นิยามไว้แล้วเป็นเมธอดนามธรรม
- คลาสรูปธรรม (Concrete class) ซับคลาสของคลาสนามธรรม กำหนดรายละเอียดของขั้นตอนย่อยที่ถูกนิยามในคลาสแม่
[แก้] ตัวอย่างโค้ด
[แก้] ภาษาจาวา
ตัวอย่างโปรแกรมคำนวณหาปริมาตรของรูปทรงกระบอกและรูปทรงสี่เหลี่ยมซึ่งมีสูตรร่วมกันดังนี้
ปริมาตร = พื้นที่ฐาน * ความสูง
โดยที่
- คำนวณหาปริมาตรในเทมเพลตเมธอดของคลาสนามธรรม
- พื้นที่ฐานของทรงกระบอกและทรงสี่เหลี่ยมมีวิธีการหาที่แตกต่างกัน อยู่ในเมธอดของซับคลาสรูปธรรม
คลาสนามธรรม ThreeDShape
นิยามเมธอด getBaseArea()
getHeight()
และ getVolume()
ซึ่งเป็นเทมเพลตเมธอดมีรายละเอียดการคำนวณหาปริมาตร
public abstract class ThreeDShape { public abstract double getBaseArea(); public abstract double getHeight(); /** * The Template Method */ public double getVolume() { return getBaseArea() * getHeight(); } }
คลาสรูปธรรม Cylinder
กำหนดวิธีการหาพื้นที่ฐานซึ่งเป็นรูปวงกลมในเมธอด getBaseArea()
public class Cylinder extends ThreeDShape { private final double radius; private final double height; public Cylinder(double radius, double height) { this.radius = radius; this.height = height; } @Override public double getBaseArea() { return Math.PI * radius * radius; } @Override public double getHeight() { return height; } }
คลาสรูปธรรม Box
กำหนดวิธีการหาพื้นที่ฐานซึ่งเป็นรูปสี่เหลี่ยมในเมธอด getBaseArea()
public class Box extends ThreeDShape { private final double width; private final double length; private final double height; public Box(double width, double length, double height) { this.width = width; this.length = length; this.height = height; } @Override public double getBaseArea() { return width * length; } @Override public double getHeight() { return height; } }
[แก้] อ้างอิง
- 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)
[แก้] แหล่งข้อมูลอื่น
- Template Method โดย Vince Huston (อังกฤษ)