GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Design pattern Creational Pattern Hướng dẫn Java Design Pattern – Factory Method

Hướng dẫn Java Design Pattern – Factory Method

Đăng vào 12/09/2018 . Được đăng bởi GP Coder . 98033 Lượt xem . Toàn màn hình

Trong bài trước chúng ta đã tìm hiểu về Singleton Design Pattern. Trong bài này chúng ta tiếp tục tìm hiểu một Pattern khác trong nhóm Creational Design Pattern là Factory Method Design Pattern.

Nội dung

  • 1 Factory Method Pattern là gì?
  • 2 Cài đặt Factory Pattern như thế nào?
  • 3 Sử dụng Factory Pattern khi nào?
  • 4 Lợi ích của Factory Pattern là gì?

Factory Method Pattern là gì?

Factory Method is a creational design pattern that Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

Factory Method Design Pattern hay gọi ngắn gọn là Factory Pattern là một trong những Pattern thuộc nhóm Creational Design Pattern. Nhiệm vụ của Factory Pattern là quản lý và trả về các đối tượng theo yêu cầu, giúp cho việc khởi tạo đổi tượng một cách linh hoạt hơn.

Factory Pattern đúng nghĩa là một nhà máy, và nhà máy này sẽ “sản xuất” các đối tượng theo yêu cầu của chúng ta.

Trong Factory Pattern, chúng ta tạo đối tượng mà không để lộ logic tạo đối tượng ở phía người dùng và tham chiếu đến đối tượng mới được tạo ra bằng cách sử dụng một interface chung.

Factory Pattern được sử dụng khi có một class cha (super-class) với nhiều class con (sub-class), dựa trên đầu vào và phải trả về 1 trong những class con đó.

Cài đặt Factory Pattern như thế nào?

Một Factory Pattern bao gồm các thành phần cơ bản sau:

  • Super Class: môt supper class trong Factory Pattern có thể là một interface, abstract class hay một class thông thường.
  • Sub Classes: các sub class sẽ implement các phương thức của supper class theo nghiệp vụ riêng của nó.
  • Factory Class: một class chịu tránh nhiệm khởi tạo các đối tượng sub class dựa theo tham số đầu vào. Lưu ý: lớp này là Singleton hoặc cung cấp một public static method cho việc truy xuất và khởi tạo đối tượng. Factory class sử dụng if-else hoặc switch-case để xác định class con đầu ra.

Ví dụ: Tất cả hệ thống ngân hàng có cung cấp API để truy cập đến hệ thống của họ. Team được giao nhiệm vụ thiết kế một API để client có thể sử dụng dịch vụ của một ngân hàng bất kỳ. Hiện tại, phía client chỉ cần sử dụng dịch vụ của 2 ngân hàng là VietcomBank và TPBank. Tuy nhiên để dễ mở rộng sau này, và phía client mong muốn không cần phải thay đổi code của họ khi cần sử dụng thêm dịch vụ của ngân hàng khác. Với yêu cầu như vậy, chúng ta có thể sử dụng một Pattern phù hợp là Factory Method Pattern.

Hệ thống được minh họa như sau:

Chương trình được cài đặt theo Factory Pattern như sau:

Supper Class:


public interface Bank {
	String getBankName();
}

Sub Classes:


package com.gpcoder.patterns.creational.factorymethod;

public class TPBank implements Bank {

	@Override
	public String getBankName() {
		return "TPBank";
	}

}


package com.gpcoder.patterns.creational.factorymethod;

public class VietcomBank implements Bank {

	@Override
	public String getBankName() {
		return "VietcomBank";
	}

}

Factory class:


public class BankFactory {

	private BankFactory() {
	}

	public static final Bank getBank(BankType bankType) {
		switch (bankType) {

		case TPBANK:
			return new TPBank();

		case VIETCOMBANK:
			return new VietcomBank();

		default:
			throw new IllegalArgumentException("This bank type is unsupported");
		}
	}

}

Bank type:


public enum BankType {

	VIETCOMBANK, TPBANK;

}

Client:


public class Client {

	public static void main(String[] args) {
		Bank bank = BankFactory.getBank(BankType.TPBANK);
		System.out.println(bank.getBankName()); // TPBank
	}
}

Như bạn thấy, phía client chỉ cần gọi duy nhất một phương thức BankFactory.getBank() là có thể sử dụng được dịch vụ của một ngân hàng bất kỳ.

Khi hệ thống muốn cung cấp thêm dịch vụ của một ngân hàng khác, chẳng hạn VietinBank, thì cần tạo thêm một class mới implement từ interface Bank, và thêm vào logic khởi tạo Bank trong Factory là xong. Nó không làm ảnh hưởng đến code ở phía Client.

Sử dụng Factory Pattern khi nào?

Factory Pattern được sử dụng khi:

  • Chúng ta có một super class với nhiều class con và dựa trên đầu vào, chúng ta cần trả về một class con. Mô hình này giúp chúng ta đưa trách nhiệm của việc khởi tạo một lớp từ phía người dùng (client) sang lớp Factory.
  • Chúng ta không biết sau này sẽ cần đến những lớp con nào nữa. Khi cần mở rộng, hãy tạo ra sub class và implement thêm vào factory method cho việc khởi tạo sub class này.

Lợi ích của Factory Pattern là gì?

Lợi ích của Factory Pattern:

  • Factory Pattern giúp giảm sự phụ thuộc giữa các module (loose coupling): cung cấp 1 hướng tiếp cận với Interface thay thì các implement. Giúp chuơng trình độc lập với những lớp cụ thể mà chúng ta cần tạo 1 đối tượng, code ở phía client không bị ảnh hưởng khi thay đổi logic ở factory hay sub class.
  • Mở rộng code dễ dàng hơn: khi cần mở rộng, chỉ việc tạo ra sub class và implement thêm vào factory method.
  • Khởi tạo các Objects mà che giấu đi xử lí logic của việc khởi tạo đấy. Người dùng không biết logic thực sực được khởi tạo bên dưới phương thức factory.
  • Dễ dạng quản lý life cycle của các Object được tạo bởi Factory Pattern.
  • Thống nhất về naming convention: giúp cho các developer có thể hiểu về cấu trúc source code.

Bạn có thể thấy Factory Pattern được áp dụng trong:

  • JDK: java.util.Calendar, ResourceBundle, NumberFormat, …
  • BeanFactory trong Spring Framework.
  • SessionFactory trong Hibernate Framework.
  • …

Như vậy tôi đã giới thiệu xong về Factory Method Pattern, hy vọng bài viết sẽ giúp ích cho các bạn trong quá trình xây dựng và phát triển ứng dụng. Mọi góp ý và thắc mắc hãy comment bên dưới, tôi sẽ cố gắng trả lời cho các bạn. Hẹn gặp lại ở các bài viết tiếp theo.

Tài liệu tham khảo:

  • https://refactoring.guru/design-patterns/factory-method
  • https://sourcemaking.com/design_patterns/factory_method
  • https://www.tutorialspoint.com/design_pattern/factory_pattern.htm
4.7
68
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Creational Pattern, Design pattern Được gắn thẻ: Creational Design Pattern, Design pattern

Hướng dẫn Java Design Pattern – Singleton
Hướng dẫn Java Design Pattern – Abstract Factory

Có thể bạn muốn xem:

  • Giới thiệu Aspect Oriented Programming (AOP) (09/02/2019)
  • Hướng dẫn Java Design Pattern – Service Locator (21/01/2019)
  • Hướng dẫn Java Design Pattern – Composite (02/11/2018)
  • Hướng dẫn Java Design Pattern – Chain of Responsibility (03/12/2018)
  • Hướng dẫn Java Design Pattern – Strategy (03/01/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98033 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97680 lượt xem)
  • Giới thiệu Design Patterns (87732 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86400 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (83806 lượt xem)

Nội dung bài viết

  • 1 Factory Method Pattern là gì?
  • 2 Cài đặt Factory Pattern như thế nào?
  • 3 Sử dụng Factory Pattern khi nào?
  • 4 Lợi ích của Factory Pattern là gì?

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link