- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Hướng dẫn sử dụng Factory trong Design Pattern
Xin chào các bạn, bài viết hôm nay mình sẻ giới thiệu đến các bạn Factory Design Pattern dùng thế nào trong lập trình C#, Winform.
[C#] How to using Factory Design Pattern
Factory Pattern là một design pattern thuộc nhóm khởi tạo (Creational patterns).
Pattern này được sinh ra nhằm mục đích khởi tạo một đối tượng mới mà không cần thiết phải chỉ ra một cách chính xác class nào sẽ được khởi tạo.
Factory Method Pattern giải quyết vấn đề này bằng cách định nghĩa một factory method cho việc tạo đối tượng, và các lớp con thừa kế có thể override phương thức này để chỉ rõ đối tượng nào sẽ được khởi tạo.
Bây giờ, mình sẽ có một ví dụ, cho các bạn dễ hiểu về factory design pattern này.
Mình có yêu cầu viết một ứng dụng, nạp tiền điện thoại cho các mạng điện thoại Việt Nam: Mobifone, VinaPhone, Viettel, Vietnamobile, Gmobile.
Request yêu cầu gởi đến ứng dụng của chúng ta gồm 2 tham số: số thoại cần nạp tiền và số tiền.
Thường trong bài viết này, chúng ta sẽ sử dụng một thiết bị modern GMS và sử dụng tập lệnh AT-Command xài lệnh USSD để nạp tiền vào tài khoản cho người dùng.
Nhưng có rắc rối ở đây là mỗi nhà mạng, đều có cấu trúc kiểm tra số dư tài khoản, hay cú pháp nạp tiền đều khác nhau.
Vậy làm sao khi gởi đến chúng ta sẽ điều hướng cho từng class nhà mạng.
Sơ đồ Design Pattern:
Đầu tiên, mình sẽ tạo một InterFace INetwork.cs
C#:
namespace FactoryPatternDemo
{
public interface INetwork
{
string GetNameNetWork();
string CheckAccountMoney();
string GetCarrierNumber();
}
}
Trong này mình khai báo ba phương thức sẵn: lấy tên nhà mạng, kiểm tra số dư tài khoản, và lấy đầu số của mỗi nhà mạng.
Tiếp đến mình sẽ tạo 5 class cho mỗi nhà mạng: viettel.cs, mobifone.cs, vinaphone.cs, vietnamobile.cs, gmobile.cs
Mỗi class này mình đều implement đến interface INetwork
- Viettel.cs
class Viettel : INetwork
{
public string CheckAccountMoney()
{
return "*101#";
}
public string GetCarrierNumber()
{
return "086, 096, 097, 098, 032, 033, 034, 035, 036, 037, 038, 039";
}
public string GetNameNetWork()
{
return "VIETTEL";
}
}
2. Mobifone.cs
class Mobifone : INetwork
{
public string CheckAccountMoney()
{
return "*101#";
}
public string GetCarrierNumber()
{
return "090, 093, 0120, 0121, 0122, 0126, 0128, 089";
}
public string GetNameNetWork()
{
return "MOBIFONE";
}
}
3. Vinaphone.cs
public class Vinaphone : INetwork
{
public string CheckAccountMoney()
{
return "*101#";
}
public string GetCarrierNumber()
{
return "091, 094, 083, 084, 085, 081, 082";
}
public string GetNameNetWork()
{
return "VINAPHONE";
}
}
4. Vietnamobile.cs
public class Vietnamobile : INetwork
{
public string CheckAccountMoney()
{
return "*101#";
}
public string GetCarrierNumber()
{
return "092, 056, 058";
}
public string GetNameNetWork()
{
return "VIETNAMOBILE";
}
}
5. Gmobile.cs
public class Gmobile : INetwork
{
public string CheckAccountMoney()
{
return "*101#";
}
public string GetCarrierNumber()
{
return "099, 059";
}
public string GetNameNetWork()
{
return "GMOBILE";
}
}
Tiếp đến mình sẽ tạo một Enum NetworkType.cs
public enum NetworkType
{
VIETTEL,
MOBIFONE,
VINAPHONE,
VIETNAMOBILE,
GMOBILE,
}
Tạo một class abstract NetworkFactory.cs:
public abstract class NetworkFactory
{
public abstract INetwork Create(NetworkType type);
}
Tiếp đến là một class ConcreteCreator.cs để điều hướng cho từng nhà mạng:
class ConcreteCreator : NetworkFactory
{
public override INetwork Create(NetworkType type)
{
switch (type)
{
case NetworkType.VIETTEL:
return new Viettel();
case NetworkType.MOBIFONE:
return new Mobifone();
case NetworkType.VINAPHONE:
return new Vinaphone();
case NetworkType.VIETNAMOBILE:
return new Vietnamobile();
case NetworkType.GMOBILE:
return new Gmobile();
default:
throw new ArgumentException("Invalid type", "type");
}
}
}
Và bây giờ chúng ta sẽ sử dụng hàm trong form program.cs
namespace FactoryPatternDemo
{
class Program
{
static void Main(string[] args)
{
var factory = new ConcreteCreator();
INetwork viettel = factory.Create(NetworkType.VIETTEL);
Console.WriteLine(viettel.GetNameNetWork());
Console.WriteLine(viettel.GetCarrierNumber());
Console.WriteLine("===========================================");
INetwork vinaphone = factory.Create(NetworkType.VINAPHONE);
Console.WriteLine(vinaphone.GetNameNetWork());
Console.WriteLine(vinaphone.GetCarrierNumber());
Console.WriteLine("===========================================");
INetwork mobiphone = factory.Create(NetworkType.MOBIFONE);
Console.WriteLine(mobiphone.GetNameNetWork());
Console.WriteLine(mobiphone.GetCarrierNumber());
Console.WriteLine("===========================================");
INetwork vietnamobile = factory.Create(NetworkType.VIETNAMOBILE);
Console.WriteLine(vietnamobile.GetNameNetWork());
Console.WriteLine(vietnamobile.GetCarrierNumber());
Console.WriteLine("===========================================");
INetwork gmobile = factory.Create(NetworkType.GMOBILE);
Console.WriteLine(gmobile.GetNameNetWork());
Console.WriteLine(gmobile.GetCarrierNumber());
Console.ReadLine();
}
}
}
Và dưới đây là kết quả khi chúng ta chạy ứng dụng:
Bây giờ, các bạn muốn viết hàm gì chung xử lý cho từng nhà mạng điện thoại, các bạn chỉ cần khai báo tên hàm vào Interface INetwork.cs.
Và sau đó các bạn vào từng class nhà mạng Override lại phương thức để thực hiện theo mong muốn của mình.
Hy vọng bài viết sẽ giúp ích được cho các bạn.
Thanks for watching!