Ô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.
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úcLoggerđóng vai trò như một giao diện. Cấu trúc này cần có con trỏ hàmlog, nhận mộtLogger*và một thông báoconst char*. Khai báo hàm nhà máycreate_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ộtLogger*. Đồng thời khai báo hàmfree_loggerđể dọn dẹp.logger.c: Triển khai hai kiểu bộ ghi nhật ký cụ thể.ConsoleLoggerchứaLoggerlà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.DummyLoggercũng chứaLogger, 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 khaicreate_loggerlà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ạngLogger*. Triển khaifree_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àmlogcủ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 downVí 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
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online