เทมเพลทเมธอดแพตเทิร์น

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

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

สารบัญ

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

UML โครงสร้างของเทมเพลทเมธอด
UML โครงสร้างของเทมเพลทเมธอด

องค์ประกอบของเทมเพลทเมธอดแพตเทิร์นมีดังนี้

  • คลาสนามธรรม (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)

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