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 - 696Abstract 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ẽ implementICafeTable
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ượngVictorianChair
,VictorianCafeTable
, ...
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!
Các bài cũ hơn
- Authorization và Authentication sử dụng Cookie trong ASP.NET Core (10:50 AM - 07/11/2022)
- Tìm hiểu Factory Design Pattern với ví dụ sử dụng ngôn ngữ C# (01:47 PM - 04/11/2022)
- Giới thiệu các phiên bản Visual Studio Community 2017-2019-2022 (03:24 PM - 03/11/2022)
- Làm thế nào để Tìm kiếm-Lọc-Phân trang dữ liệu trong ASP.NET Core (09:48 AM - 03/11/2022)
- Làm thế nào để tạo Area và Layout trong ASP.NET Core (09:28 AM - 31/10/2022)