Menu
CoddyTech

Ôn tập: Factory ghi nhật ký

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

challenge icon

Thử thách

Dễ

Hãy xây dựng một nhà máy tạo bộ ghi nhật ký: một hệ thống minh họa sức mạnh của việc kết hợp mẫu Factory với tính đa hình. Nhà máy sẽ tạo các cách triển khai bộ ghi nhật ký khác nhau dựa trên cờ cấu hình, cho phép code chuyển đổi giữa việc ghi thông tin chi tiết ra bảng điều khiển và ghi nhật ký “dummy” im lặng mà không cần thay đổi cách sử dụng bộ ghi nhật ký.

Bạn sẽ tổ chức code trong ba tệp:

  • logger.h: Định nghĩa cấu trúc Logger đóng vai trò như một giao diện. Cấu trúc này cần có con trỏ hàm log, nhận một Logger* và một thông báo const char*. Khai báo hàm nhà máy create_logger, nhận một cờ số nguyên (1 cho bộ ghi nhật ký ra bảng điều khiển, 0 cho bộ ghi nhật ký dummy) và trả về một Logger*. Đồng thời khai báo hàm free_logger để dọn dẹp.
  • logger.c: Triển khai hai kiểu bộ ghi nhật ký cụ thể. ConsoleLogger chứa Logger làm thành viên đầu tiên và có hàm ghi nhật ký in thông báo theo định dạng [LOG] message. DummyLogger cũng chứa Logger, nhưng hàm ghi nhật ký của nó không làm gì cả. Hàm này chỉ đơn giản trả về mà không in gì. Tạo các hàm khởi tạo cho mỗi kiểu để cấp phát bộ nhớ và thiết lập hàm ghi nhật ký phù hợp. Sau đó, triển khai create_logger làm hàm nhà máy, kiểm tra cờ và trả về kiểu bộ ghi nhật ký phù hợp dưới dạng Logger*. Triển khai free_logger để giải phóng bộ nhớ.
  • main.c: Đọc một số nguyên (1 hoặc 0) để xác định cần tạo bộ ghi nhật ký nào. Dùng hàm nhà máy để tạo bộ ghi nhật ký phù hợp, sau đó gọi hàm log của nó với hai thông báo: "Starting application" và "Shutting down". Cuối cùng, giải phóng bộ ghi nhật ký.

Chương trình nhận một đầu vào: số nguyên cho biết kiểu bộ ghi nhật ký (1 cho bộ ghi nhật ký ra bảng điều khiển, 0 cho bộ ghi nhật ký dummy).

Ví dụ đầu ra khi đầu vào là 1:

[LOG] Starting application
[LOG] Shutting down

Ví dụ đầu ra khi đầu vào là 0:

(Không có đầu ra: bộ ghi nhật ký dummy âm thầm bỏ qua tất cả thông báo)

Điểm tinh tế ở đây là main.c sử dụng bộ ghi nhật ký theo cùng một cách, bất kể nhận được kiểu nào. Hàm nhà máy quyết định cần tạo đối tượng nào, còn tính đa hình đảm bảo hành vi phù hợp sẽ được thực thi. Mẫu này rất hữu ích trong các ứng dụng thực tế, nơi bạn có thể muốn ghi nhật ký chi tiết trong quá trình phát triển nhưng vận hành im lặng khi đưa vào sản xuất.

Tự làm thử

#include <stdio.h>
#include "logger.h"

int main() {
    // Đọc cờ chọn loại logger (1 cho console, 0 cho dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Dùng factory để tạo logger phù hợp
    
    // TODO: Gọi hàm (function) log của logger với "Starting application"
    
    // TODO: Gọi hàm log của logger với "Shutting down"
    
    // TODO: Giải phóng logger
    
    return 0;
}

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 C online