- [C#] Ẩn ứng dụng winform từ Apps vào Background Process trên Task Manager
- [SQLSERVER] Xử lý ngoại lệ sử dụng TRY...CATCH và RAISEERROR
- [C#] Bắt sự kiện bàn phím chuột bên ngoài ứng dụng winform sử dụng thư viện MouseKeyHook
- [DEVEXPRESS] Đặt mật khẩu và bỏ mật khẩu tập tin file PDF
- [C#] Thêm ứng dụng vào Taskbar sử dụng SharpShell DeskBand
- [C#] Hướng dẫn thêm text vào hình ảnh icon winform
- [C#] Chia sẽ tổng hợp source code đồ án về Csharp
- [C#] Hướng dẫn viết ứng dụng quay màn hình video winform, Screen Recorder
- [C#] Hướng dẫn sử dụng thư viện Input Simulator để làm việc với Keyboard, Mouse Virtual
- [DEVEXPRESS] Hướng dẫn tích Filter Contain khi click chuột phải vào cell selection trên Gridview
- [C#] Tra cứu mã số thuế cá nhân bằng CMND hoặc CCCD
- [C#] Convert hình ảnh image thành Blurhash sử dụng trong loading image winform
- [POWERSHELL] Script sao lưu backup và nén database sqlserver
- [C#] Giới thiệu thư viện Autofac Dependency Injection
- [C#] Hướng dẫn tạo Windows Services đơn giản Winform
- [C#] Một click chuột điều khiển máy tính từ xa sử dụng Ultraviewer
- Hướng dẫn đóng gói phần mềm sử dụng Powershell biên dịch script thành file exe
- [C#] Hướng dẫn sử dụng Task Dialog trên NET 5
- [C#] Hướng dẫn xem lịch sử các trang web đã truy cập trên Chrome Browser
- [C#] Hướng dẫn lấy thông tin Your ID và Password của Ultraviewer 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!