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

Mục lục

Trang chủBlogMẫu thiết kế Factory tron...
Java

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

3 phút đọc07/07/2025
CyStack Author
Bao Tran

Web Developer

0 lượt xem
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.

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.

Về tác giả

Bao Tran
Bao TranWeb Developer

I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community. @#@ Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.

Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn

Thảo luận (0)

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

Bài viết liên quan