แบบแผนเทมเพลตเมธอด
แบบแผนเทมเพลตเมธอด (อังกฤษ: 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 (อังกฤษ)