- vừa được xem lúc

[Design Patterns] Factory Pattern

0 0 13

Người đăng: Thịnh Trần

Theo Viblo Asia

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

package shapefactory; public interface Shape { void draw();
}

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

package shapefactory; class Circle
implements Shape { @Override public void draw() { System.out.println("Một hình tròn."); }
}

shapefactory/Triangle.java

package shapefactory; class Triangle
implements Shape { @Override public void draw() { System.out.println("Một hình tam giác."); }
}

shapefactory/Square.java

package shapefactory; class Square
implements Shape { @Override public void draw() { 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

package shapefactory; public class Factory { public Shape createShape(String type) { if (type == null) return null; if (type.equalsIgnoreCase("circle")) return new Circle(); if (type.equalsIgnoreCase("triangle")) return new Triangle(); if (type.equalsIgnoreCase("square")) return new Square(); else return null; }
}

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

import shapefactory.Factory;
import shapefactory.Shape; public class FactoryPatternDemo { public static void main(String[] args) { Factory shapeFactory = new Factory(); // 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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Closure trong Javascript - Phần 2: Định nghĩa và cách dùng

Các bạn có thể đọc qua phần 1 ở đây. Để mọi người không quên, mình xin tóm tắt gọn lại khái niệm lexical environment:.

0 0 51

- vừa được xem lúc

Var vs let vs const? Các cách khai báo biến và hằng trong Javascript

Dạo này mình tập tành học Javascript, thấy có 2 cách khai báo biến khác nhau nên đã tìm tòi sự khác biệt. Nay xin đăng lên đây để mọi người đọc xong hy vọng phân biệt được giữa let và var, và sau đó là khai báo hằng bằng const.

0 0 31

- vừa được xem lúc

VueJS: Tính năng Mixins

Chào mọi người, hôm nay mình sẽ viết về Mixins và 1 số vấn đề trong sử dụng Mixins hay ho mà mình gặp trong dự án thực. Trích dẫn từ trang chủ của VueJS:.

0 0 27

- vừa được xem lúc

Asset Pipeline là cái chi chi?

Asset Pipeline. Asset pipeline là cái chi chi. . Giải thích:.

0 0 47

- vừa được xem lúc

Tạo data table web app lấy dữ liệu từ Google Sheets sử dụng Apps Script

Google Sheets là công cụ tuyệt vời để lưu trữ bảng tính trực tuyến, bạn có thể truy cập bảng tính bất kỳ lúc nào ở bất kỳ đâu và luôn sẵn sàng để chia sẻ với người khác. Bài này gồm 2 phần.

0 0 266

- vừa được xem lúc

Học Deep Learning trên Coursera miễn phí

Bạn muốn bắt đầu với Deep Learning nhưng không biết bắt đầu từ đâu? Bạn muốn có một công việc ở mức fresher về Deep Learning? Bạn muốn khoe bạn bè về kiến thức Deep Learning của mình. Bắt đầu từ đâu.

0 0 35