- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# 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!