Trang chủHướng dẫnTemplate Method Pattern trong Java

Template Method Pattern trong Java

CyStack blog 3 phút để đọc
CyStack blog27/10/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

Template Method Pattern là một mẫu thiết kế thuộc nhóm behavioral design pattern (mẫu thiết kế hành vi). Mẫu thiết kế này được dùng để tạo một phương thức khung (method stub) và hoãn việc hiện thực một số bước cụ thể cho các lớp con.

1. Khái niệm mẫu thiết kế Template Method trong Java

Template Method định nghĩa các bước để thực hiện một thuật toán và có thể cung cấp các phần triển khai mặc định. Những phần này thường giống nhau cho tất cả hoặc một số lớp con.

Ví dụ: Giả sử ta muốn đưa ra một thuật toán xây nhà. Các bước gồm:

  1. Xây móng
  2. Xây cột
  3. Xây tường
  4. Lắp cửa sổ

Thứ tự các bước không thể thay đổi (không thể lắp cửa sổ trước khi xây móng).

Vì vậy, ta có thể tạo một phương thức template gọi lần lượt các bước này.

Ví dụ, việc xây móng có thể giống nhau cho mọi loại nhà (nhà gỗ, nhà kính…), Vì vậy, chúng ta có thể cung cấp phần triển khai mặc định cho bước này. Nếu lớp con muốn, vẫn có thể ghi đè (override), nhưng thường sẽ giữ nguyên.

Để chắc chắn lớp con không ghi đè phương thức template, ta nên khai báo nó là final.

2. Lớp trừu tượng Template Method

Vì chúng ta muốn một số phương thức được cài đặt bởi các lớp con, nên lớp cơ sở của chúng ta phải là một lớp trừu tượng.

HouseTemplate.java

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//template method, final so subclasses can't override
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//default implementation
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//methods to be implemented by subclasses
	public abstract void buildWalls();
	public abstract void buildPillars();

	private void buildFoundation() {
		System.out.println("Building foundation with cement,iron rods and sand");
	}
}

Phương thức buildHouse() là template method, thường dùng để định nghĩa thứ tự thực thi các bước.

Các lớp cụ thể (Concrete Classes) của Template Method

Chúng ta có thể có nhiều loại nhà khác nhau, chẳng hạn như nhà gỗ và nhà kính.

WoodenHouse.java

package com.journaldev.design.template;

public class WoodenHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Wooden Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with Wood coating");
	}

}

Chúng ta có thể ghi đè các phương thức khác, nhưng để đơn giản, ở đây không làm vậy.

GlassHouse.java

package com.journaldev.design.template;

public class GlassHouse extends HouseTemplate {

	@Override
	public void buildWalls() {
		System.out.println("Building Glass Walls");
	}

	@Override
	public void buildPillars() {
		System.out.println("Building Pillars with glass coating");
	}

}

Chương trình kiểm thử (Client)

Hãy kiểm tra ví dụ về Template Method pattern với một chương trình test.

HousingClient.java

package com.journaldev.design.template;

public class HousingClient {

	public static void main(String[] args) {

		HouseTemplate houseType = new WoodenHouse();

		//using template method
		houseType.buildHouse();
		System.out.println("************");

		houseType = new GlassHouse();

		houseType.buildHouse();
	}

}

Chú ý rằng client gọi phương thức template từ lớp cha, và tùy vào cách cài đặt các bước, nó sẽ sử dụng một số phương thức từ lớp cha và một số từ lớp con.

Kết quả chương trình:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

Sơ đồ lớp Template Method

image.png

Template Method pattern trong JDK

  • Tất cả các phương thức không trừu tượng của java.io.InputStream, java.io.OutputStream, java.io.Readerjava.io.Writer.
  • Tất cả các phương thức không trừu tượng của java.util.AbstractList, java.util.AbstractSetjava.util.AbstractMap.

Những điểm quan trọng của Template Method Pattern

  1. Template Method nên bao gồm một số bước có thứ tự cố định; với một số phương thức, phần cài đặt sẽ khác nhau giữa lớp cha và lớp con. Template Method nên được khai báo final.
  2. Thông thường, lớp con gọi các phương thức của lớp cha; nhưng trong Template Pattern, phương thức template của lớp cha lại gọi các phương thức từ lớp con. Điều này được gọi là Nguyên tắc Hollywood“Đừng gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn”.
  3. Các phương thức trong lớp cha có cài đặt mặc định được gọi là Hook. Chúng được thiết kế để lớp con ghi đè nếu cần. Nếu muốn một số phương thức không bị ghi đè, bạn có thể đặt chúng là final. Ví dụ, trong trường hợp này, ta có thể đặt buildFoundation()final nếu không muốn lớp con thay đổi nó.

Đó là tất cả về Mẫu Thiết kế Template Method trong Java. Hy vọng bạn thấy nó hữu ích!

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất