[Design Patterns] Factory Pattern

Factory là một trong những dạng thức triển khai được sử dụng nhiều nhất và được xếp vào nhóm các dạng thức Khởi Tạo. Trong phép triển khai Factory, chúng ta tạo ra các object mà không để mở logic khởi tạo cho phía client (đoạn code gửi yêu cầu và sử dụng object được

Factory là một trong những dạng thức triển khai được sử dụng nhiều nhất và được xếp vào nhóm các dạng thức Khởi Tạo.

Trong phép triển khai Factory, chúng ta tạo ra các object mà không để mở logic khởi tạo cho phía client (đoạn code gửi yêu cầu và sử dụng object được khởi tạo). Thêm vào đó, việc tham chiếu tới object được khởi tạo sẽ được thực hiện thông qua một interface (giao diện) chung thay vì sử dụng class cụ thể.

Áp dụng triển khai

  • Chúng ta sẽ tạo ra 01 interface chung có tên là Shape cho các class mô tả hình 2D (hình tròn, tam giác, hình vuông) và các class cụ thể triển khai interface này.
  • Ở bước tiếp theo, 01 class có tên là Factory sẽ được định nghĩa.
  • Cuối cùng là main của chương trình sẽ sử dụng Factory để yêu cầu khởi tạo 1 Shape (hình 2D). main sẽ truyền vào thông tin về kiểu Shape muốn khởi tạo (circle / triangle / square – hình tròn / tam giác / hình vuông).

sơ đồ các class

Về mặt quản lý code, chúng ta sẽ có 1 package được đặt tên là shapefactory. Package này sẽ chứa:

  • 01 class Factory mở public
  • 01 interface Shape mở public
  • 03 class triển khai để default

Điều này có nghĩa là code client ở phía bên ngoài package sẽ hoàn toàn không biết tới 03 class triển khai Shape mà chỉ có thể gọi Factory để khởi tạo các Shape và tham chiếu tới các object được tạo ra thông qua interface.

Bước 1

Tạo 01 interface có tên là Shape mở public.

shapefactory/Shape.java

packageshapefactory;publicinterfaceShape{voiddraw();}

Bước 2

Tạo các class cụ thể triển khai interface với access modifier đặt default, không mở public.

shapefactory/Circle.java

packageshapefactory;classCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tròn.");}}

shapefactory/Triangle.java

packageshapefactory;classTriangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình tam giác.");}}

shapefactory/Square.java

packageshapefactory;classSquareimplementsShape{@Overridepublicvoiddraw(){System.out.println("Một hình vuông.");}}

Bước 3

Tạo 1 Factory để sản xuất các Object thực thể với thông tin được cung cấp từ code client.

shapefactory/Factory.java

packageshapefactory;publicclassFactory{publicShapecreateShape(String type){if(type ==null)returnnull;if(type.equalsIgnoreCase("circle"))returnnewCircle();if(type.equalsIgnoreCase("triangle"))returnnewTriangle();if(type.equalsIgnoreCase("square"))returnnewSquare();elsereturnnull;}}

Bước 4

Sử dụng Factory trong code client ở main để yêu cầu khởi tạo các Object bằng cách truyền vào thông tin về loại hình của Shape.

FactoryPatternDemo.java

importshapefactory.Factory;importshapefactory.Shape;publicclassFactoryPatternDemo{publicstaticvoidmain(String[] args){Factory shapeFactory =newFactory();// Yêu cầu khởi tạo một Object hình tròn và gọi draw() để vẽShape circle = shapeFactory.createShape("circle");
      circle.draw();// Yêu cầu khởi tạo một Object hình tam giác và gọi draw() để vẽShape triangle = shapeFactory.createShape("triangle");
      triangle.draw();// Yêu cầu khởi tạo một Object hình vuông và gọi draw() để vẽShape square = shapeFactory.createShape("square");
      square.draw();}}

Bước 5

Kiểm chứng lại kết quả được in ra ở Console.

console

Một hình tròn.
Một hình tam giác.
Một hình vuông.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ