CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnMẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả
Java

Mẫu thiết kế Factory trong Java là gì? Cách sử dụng hiệu quả

CyStack blog 3 phút để đọc
CyStack blog07/07/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 3 minutes

Chào mừng bạn đến với bài hướng dẫn về mẫu thiết kế Factory trong Java. Đây là một trong những mẫu thiết kế thuộc nhóm khởi tạo (creational). Nó được sử dụng rộng rãi trong JDK cũng như trong các framework như Spring và Struts.

Mẫu thiết kế Factory trong Java

Mẫu thiết kế Factory

Mẫu thiết kế factory được sử dụng khi ta có một superclass (lớp cha) với nhiều subclass (lớp con) và cần trả về một trong các subclass đó dựa trên đầu vào. Mẫu này tách trách nhiệm khởi tạo thực thể của một class ra khỏi chương trình khách và chuyển cho Factory class.

Trước tiên, hãy cùng tìm hiểu cách triển khai mẫu thiết kế Factory trong Java, sau đó xem xét các ưu điểm và một vài ví dụ sử dụng nó trong JDK. Lưu ý rằng mẫu này còn có tên gọi khác là Factory Method.

Super class

Trong mẫu thiết kế này, super class có thể là một interface, một abstract class (lớp trừu tượng) hoặc một lớp Java thông thường. Với ví dụ trong bài, ta sẽ sử dụng một super class dạng trừu tượng có phương thức toString() được ghi đè để phục vụ việc kiểm thử.

package com.journaldev.design.model;

public abstract class Computer {
	
	public abstract String getRAM();
	public abstract String getHDD();
	public abstract String getCPU();
	
	@Override
	public String toString(){
		return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
	}
}

Subclass

Giả sử, ta có hai subclass là PC và Server như dưới đây.

package com.journaldev.design.model;

public class PC extends Computer {

	private String ram;
	private String hdd;
	private String cpu;
	
	public PC(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}

Lưu ý rằng cả hai lớp này đều kế thừa từ super class Computer.

package com.journaldev.design.model;

public class Server extends Computer {

	private String ram;
	private String hdd;
	private String cpu;
	
	public Server(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}

}

Factory class

Khi đã có super class và các subclass, chúng ta có thể bắt đầu viết Factory class. Dưới đây là một triển khai cơ bản.

package com.journaldev.design.factory;

import com.journaldev.design.model.Computer;
import com.journaldev.design.model.PC;
import com.journaldev.design.model.Server;

public class ComputerFactory {

	public static Computer getComputer(String type, String ram, String hdd, String cpu){
		if("PC".equalsIgnoreCase(type)) return new PC(ram, hdd, cpu);
		else if("Server".equalsIgnoreCase(type)) return new Server(ram, hdd, cpu);
		
		return null;
	}
}

Một vài điểm quan trọng đáng chú ý của mẫu thiết kế Factory là:

  • Lớp Factory có thể được viết theo mẫu Singleton, hoặc phương thức trả về subclass có thể được khai báo là static.
  • Tùy vào tham số đầu vào, một đối tượng subclass tương ứng sẽ tạo và trả về. getComputer là một ví dụ về Factory method.

<img>

Dưới đây là một chương trình client (bên sử dụng lớp, hàm, đối tượng) đơn giản để kiểm tra triển khai mẫu thiết kế Factory ở trên.

package com.journaldev.design.test;

import com.journaldev.design.factory.ComputerFactory;
import com.journaldev.design.model.Computer;

public class TestFactory {

	public static void main(String[] args) {
		Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
		Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
		System.out.println("Factory PC Config::"+pc);
		System.out.println("Factory Server Config::"+server);
	}

}

Kết quả của chương trình trên là:

Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

Ưu điểm của mẫu thiết kế Factory

  1. Mẫu này cung cấp cách tiếp cận lập trình hướng về interface thay vì triển khai.
  2. Mẫu này tách việc khởi tạo các triển khai lớp cụ thể ra khỏi code của client. Điều này giúp code của chúng ta giảm phụ thuộc và dễ mở rộng hơn. Ví dụ, ta có thể dễ dàng thay đổi triển khai của class PC vì chương trình client không hề biết về sự thay đổi này.
  3. Mẫu này cung cấp một lớp trừu tượng giữa triển khai và client thông qua tính kế thừa.

Ví dụ về mẫu thiết kế Factory trong JDK

  1. Các phương thức getInstance() trong java.util.Calendar, ResourceBundleNumberFormat đều sử dụng mẫu Factory.
  2. Phương thức valueOf() trong các lớp bọc như Boolean, Integer, v.v.

Tổng kết

Bạn có thể tải code ví dụ trên từ link này. Sau khi tìm hiểu về mẫu thiết kế Factory, bạn có thể linh hoạt tạo các đối tượng dựa trên yêu cầu mà không cần sửa đổi phía client. Đây là yếu tốt quan trọng để bạn có thể viết code có tính mở rộng cao và dễ dàng bảo trì hơn.

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