Menu
CoddyTech

Ôn tập: Factory Logger

Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 66 trên 70.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống ghi nhật ký bằng mẫu Factory! Bạn sẽ tạo các kiểu bộ ghi nhật ký khác nhau dùng chung một giao diện, sau đó dùng hàm factory để tạo bộ ghi nhật ký phù hợp dựa trên một đối số chuỗi đơn giản.

Bạn sẽ sắp xếp code trong bốn tệp:

  • ConsoleLogger.lua: Tạo lớp ConsoleLogger với hàm khởi tạo :new() và phương thức :log(message). Khi gọi :log(), phương thức này sẽ in thông điệp với tiền tố [CONSOLE], chẳng hạn như [CONSOLE] Your message here.
  • FileLogger.lua: Tạo lớp FileLogger có cấu trúc tương tự: hàm khởi tạo :new() và phương thức :log(message). Thay vào đó, bộ ghi nhật ký này sẽ in thông điệp với tiền tố [FILE].
  • LoggerFactory.lua: Đây là nơi mẫu Factory kết hợp mọi thứ! Tạo hàm createLogger(loggerType) nhận một đối số chuỗi. Nếu kiểu là "console", hãy trả về một ConsoleLogger mới. Nếu kiểu là "file", hãy trả về một FileLogger mới. Factory xử lý mọi chi tiết về việc khởi tạo lớp nào.
  • main.lua: Nạp module LoggerFactory. Đọc hai đầu vào: kiểu bộ ghi nhật ký và thông điệp cần ghi. Dùng factory để tạo bộ ghi nhật ký phù hợp, sau đó gọi phương thức :log() của nó với thông điệp đó.

Điểm tinh tế của thiết kế này là code chính chỉ tương tác với factory. Nó không cần biết trực tiếp về ConsoleLogger hay FileLogger. Cả hai bộ ghi nhật ký đều triển khai cùng một giao diện :log(), nên bạn có thể dùng chúng thay thế cho nhau.

Bạn sẽ nhận hai đầu vào:

  1. Kiểu bộ ghi nhật ký (là "console" hoặc "file")
  2. Thông điệp cần ghi

Ví dụ, nếu đầu vào là console và Application started, đầu ra sẽ là:

[CONSOLE] Application started

Nếu đầu vào là file và Saving user data..., đầu ra sẽ là:

[FILE] Saving user data...

Tự làm thử

-- main.lua
-- Điểm bắt đầu chính của hệ thống ghi nhật ký

local LoggerFactory = require('LoggerFactory')

-- Đọc dữ liệu đầu vào
local loggerType = io.read()
local message = io.read()

-- TODO: Dùng LoggerFactory để tạo logger phù hợp
-- Sau đó gọi phương thức :log() với thông điệp

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Lua online