CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Tìm hiểu Abstract Factory Design Pattern với ví dụ sử dụng ngôn ngữ C#

Đăng lúc: 08:50 AM - 08/11/2022 bởi Charles Chung - 474

Abstract Factory Pattern là một mẫu thiết thế thuộc nhóm Creational nó cho phép tạo ra các đối tượng có liên quan với nhau mà không chỉ ra những lớp cụ thể nào ở thời điểm thiết kế.

1. Đặt vấn đề

Giả sử chúng ta có một nhà máy sản xuất nội thất với nhiều phân xưởng. Cái thì phụ trách sản xuất nội thất bàn, cái sản xuất ghế, cái thì sản xuất sofa,..Yêu cầu đặt ra là chúng ta cần tạo ra nhà máy sao cho nó đáp ứng được hầu hết các thay đổi thị hiếu người dùng và thị trường, như khách hàng thích đồ tân cổ, khách hàng thích hiện đại, khách hàng cần sản phẩm deco...Với điều kiện là không phải đầu tư thêm máy móc và nhân công hay sắp xếp lại bộ máy nhân sự vì rất tốn kém và mất nhiều thời gian. Điều này cũng tượng tự như việc thiết kế hệ thống phần mềm, ở bài viết này tôi giả sử phần mềm này là một nhà máy sản xuất nội thất.

Với yêu cầu đặt ra như vậy chúng ta cần một cách để tạo ra các dòng sản phẩm một cách riêng biệt. Ví dụ nội thất cổ điển có bàn và ghế, nội thất hiện đại có bàn và ghế.

2. Giải pháp

  • Điều đầu tiên Abstract Factory pattern đề xuất khai báo một cách rõ ràng các interface cho mỗi loại sản phẩm nội thất riêng biệt (Ví dụ: IChair, ICafeTable). Tiếp theo, bạn cần làm tất cả biến thể của sản phẩm nội thất theo các interface. Ví dụ, tất cả các biến thể của Chair sẽ implement IChair interface, các biến thể của CafeTable sẽ implement ICafeTable interface,..Các bạn có thể hình dung như hình bên dưới:

  • Tiếp đến bạn khai báo Abstract Factory, một interface với một danh sách các phương thức để tạo tất cả các sản phẩm nội thất thuộc cùng dòng sản phẩm (dòng ở đây được hiểu là các mẫu cổ điển, hiện đại)
  • Bây giờ, làm thế nào với các biến thể sản phẩm nội thất? Với mỗi loại biến thể của dòng sản phẩm nội thất, chúng ta tạo ra một factory class tách biệt dựa trên AbstractFactory interface. Một factory class là một class mà trả về sản phẩm nội thất của một loại riêng biệt. Ví dụ VitorianFurniture sẽ chỉ tạo ra các đối tượng VictorianChairVictorianCafeTable, ...

3. Code Demo C#

Tệp IChair.cs

namespace Furniture
{
    //Giao diện Chair(ghế)
    interface IChair
    {
        //phương thức trả về tên ghế
        string GetName();
        //phương thức trả về số chân
        int GetLegs();
    }

    //Lớp VictorianChair(ghế cổ điển) thực thi từ giao diện Chair
    class VictorianChair : IChair
    {
        public int GetLegs()
        {
            return 4;
        }

        public string GetName()
        {
            return "Victorian Chair";
        }
    }
    //Lớp ModernChair(ghế hiện đại) thực thi từ giao diện Chair
    class ModernChair : IChair
    {
        public int GetLegs()
        {
            return 2;
        }

        public string GetName()
        {
            return "Modern Chair";
        }
    }
}

Tệp ICafeTable.cs

namespace Furniture
{
    //Giao diện CafeTable(bàn cafe)
    interface ICafeTable
    {
        //phương thức trả về tên bàn
        string GetName();
        //phương thức trả về số chân
        int GetLegs();
    }

    //Lớp VictorianCafeTable(bàn cafe cổ điển) thực thi từ giao diện ICafeTable
    class VictorianCafeTable : ICafeTable
    {
        public int GetLegs()
        {
            return 4;
        }

        public string GetName()
        {
            return "Victorian Cafe Table";
        }
    }

    //Lớp ModernCafeTable(bàn cafe cổ điển) thực thi từ giao diện ICafeTable
    class ModernCafeTable : ICafeTable
    {
        public int GetLegs()
        {
            return 3;
        }

        public string GetName()
        {
            return "Modern Cafe Table";
        }
    }
}

Tệp IFurnitureFactory.cs

namespace Furniture
{
    //Giao diện FurnitureFactory (nhà máy sản xuất nội thất)
    interface IFurnitureFactory
    {
        //phương thức tạo ghế
        IChair CreateChair();
        //phương thức tạo bàn cafe
        ICafeTable CreateCafeTable();
    }

    //Lớp VictorianFurniture(sản xuất nội thất cổ điển)
    //thực thi từ giao diện FurnitureFactory
    class VictorianFurniture : IFurnitureFactory
    {
        public ICafeTable CreateCafeTable()
        {
            return new VictorianCafeTable();
        }

        public IChair CreateChair()
        {
            return new VictorianChair();
        }
    }
    //Lớp ModernFurniture(sản xuất nội thất hiện đại)
    //thực thi từ giao diện FurnitureFactory
    class ModernFurniture : IFurnitureFactory
    {
        public ICafeTable CreateCafeTable()
        {
            return new ModernCafeTable();
        }

        public IChair CreateChair()
        {
            return new ModernChair();
        }
    }
}

Tệp ClientFurniture.cs

namespace Furniture
{
    //Lớp ClientFurniture(Khách hàng nội thất)
    class ClientFurniture
    {
        //phương thức tạo nội thất cho khách hàng với tham số đầu vào là nhà máy sản xuất nội thất
        //khi sử dụng truyền vào nhà máy nào thì ra nội thất đó
        public void CreateFurniture(IFurnitureFactory factory)
        {
            var chair = factory.CreateChair();
            var cafeTable = factory.CreateCafeTable();
            Console.WriteLine("---------------Details-------------");
            Console.WriteLine("Chair Name:"+ chair.GetName());
            Console.WriteLine("Legs:"+ chair.GetLegs());

            Console.WriteLine("Cafe Table Name:" + cafeTable.GetName());
            Console.WriteLine("Cafe Table Legs:"+ cafeTable.GetLegs());
        }
    }
}

Tệp Program.cs
namespace Furniture
{
    //Chương trình chính
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Example Abstract Factory Design Pattern");
            //tạo đối tượng khách hàng nội thất
            var client = new ClientFurniture();
            //gọi phương thức với tham số của từng loại
            client.CreateFurniture(new VictorianFurniture());
            client.CreateFurniture(new ModernFurniture());
        }
    }
}

Link tải ví dụ trong bài viết (Google Drive)

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ