Menu
CoddyTech

Giới thiệu về mẫu thiế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 51 trên 70.

Các mẫu thiết kế là những giải pháp đã được kiểm chứng cho các vấn đề phổ biến mà nhà phát triển thường gặp khi xây dựng phần mềm. Thay vì phải sáng tạo lại từ đầu mỗi lần, các mẫu thiết kế cung cấp cho chúng ta một vốn từ chung và những cách tiếp cận đã được thử nghiệm để tổ chức code.

Hãy xem mẫu thiết kế như những bản thiết kế. Chúng không cung cấp đoạn code chính xác để bạn sao chép, mà mô tả cách tổ chức lớp và đối tượng để giải quyết những thử thách cụ thể. Khi ai đó nhắc đến “dùng mẫu Factory ở đây”, các nhà phát triển giàu kinh nghiệm sẽ hiểu ngay cấu trúc tổng quát được đề xuất.

Mẫu thiết kế gồm ba nhóm chính:

NhómMục đíchVí dụ
Khởi tạoCách tạo đối tượngSingleton, Factory
Cấu trúcCách kết hợp các đối tượngAdapter, Decorator
Hành viCách các đối tượng giao tiếpObserver, Strategy

Các mẫu thiết kế chúng ta sẽ tìm hiểu dựa trực tiếp trên những khái niệm lập trình hướng đối tượng (OOP) bạn đã học, gồm giao diện (interface), kế thừa (inheritance), đa hình (polymorphism) và tính kết hợp (composition). Mỗi mẫu thiết kế vận dụng những kiến thức nền tảng này theo cách riêng để tăng tính linh hoạt, dễ bảo trì hoặc khả năng tái sử dụng.

Trong các bài học sắp tới, bạn sẽ triển khai một số mẫu thiết kế thiết yếu, bắt đầu với Singleton, Factory, Observer và Strategy. Hiểu các mẫu thiết kế này sẽ giúp bạn nhận ra những giải pháp phổ biến trong các codebase hiện có và đưa ra quyết định kiến trúc tốt hơn trong các dự án của mình.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống danh mục mẫu thiết kế đơn giản để sắp xếp thông tin về các mẫu thiết kế trong nhiều tệp. Việc này sẽ giúp bạn hiểu cách phân loại các mẫu thiết kế, đồng thời rèn luyện cách tổ chức code tốt.

Bạn sẽ tạo ba tệp để phân chia các trách nhiệm khác nhau:

  • Pattern.cs: Định nghĩa lớp Pattern trong không gian tên Patterns, đại diện cho một mẫu thiết kế. Mỗi mẫu thiết kế cần có Name, Category (Creational, Structural hoặc Behavioral) và Description. Thêm phương thức GetSummary() để trả về một chuỗi được định dạng như sau: [{Category}] {Name}: {Description}
  • PatternCatalog.cs: Tạo lớp PatternCatalog trong không gian tên Patterns để quản lý một tập hợp các mẫu thiết kế. Danh mục của bạn cần có khả năng thêm mẫu thiết kế và có phương thức GetPatternsByCategory(string category) trả về danh sách tất cả mẫu thiết kế thuộc danh mục đó. Đồng thời, thêm phương thức GetAllSummaries() để trả về danh sách chuỗi tóm tắt của tất cả mẫu thiết kế trong danh mục.
  • Program.cs: Kết hợp mọi thứ bằng cách tạo một danh mục và thêm các mẫu thiết kế dựa trên đầu vào. Sau đó, hiển thị các mẫu thiết kế được lọc theo danh mục.

Bạn sẽ nhận các đầu vào sau:

  • Số lượng mẫu thiết kế cần thêm
  • Với mỗi mẫu thiết kế: ba dòng chứa tên, danh mục và mô tả
  • Một danh mục để lọc

Sau khi thêm tất cả mẫu thiết kế vào danh mục, hãy in tóm tắt của các mẫu thiết kế thuộc danh mục đã lọc, mỗi dòng một tóm tắt. Nếu không có mẫu nào khớp, hãy in No patterns found.

Ví dụ, nếu đầu vào là:

3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
Creational

Đầu ra sẽ là:

[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact class

Thử thách này cho thấy cách sắp xếp các lớp có liên quan trong những tệp riêng giúp cơ sở code của bạn gọn gàng và dễ bảo trì. Nguyên tắc này càng quan trọng hơn khi bạn triển khai các mẫu thiết kế thực tế trong những bài học sắp tới!

Tự làm thử

using System;
using System.Collections.Generic;
using Patterns;

class Program
{
    public static void Main(string[] args)
    {
        // Đọc số lượng mẫu
        int n = Convert.ToInt32(Console.ReadLine());
        
        // Tạo một PatternCatalog mới
        PatternCatalog catalog = new PatternCatalog();
        
        // TODO: Đọc thông tin của từng mẫu (tên, danh mục, mô tả)
        // và thêm chúng vào danh mục
        for (int i = 0; i < n; i++)
        {
            string name = Console.ReadLine();
            string category = Console.ReadLine();
            string description = Console.ReadLine();
            
            // TODO: Tạo một Pattern và thêm vào danh mục
        }
        
        // Đọc danh mục dùng để lọc
        string filterCategory = Console.ReadLine();
        
        // TODO: Lấy các mẫu thuộc danh mục cần lọc
        // và in ra phần tóm tắt của chúng
        // Nếu không có mẫu nào khớp, in ra "No patterns found"
    }
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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