[Kiến trúc phần mềm] Mẫu thiết kế Abstract Factory

1.Khái niệm:


thiết kế mẫu hướng đối tượng trong việc thiết kế phần mềm cho máy tính, cung cấp một giao diện lớp có chức năng tạo ra một tập hợp các đối tượng liên quan hoặc phụ thuộc lẫn nhau mà không chỉ ra đó là những lớp cụ thể nào tại thời điểm thiết kế.

2. Sơ đồ mẫu Abstract Factory



Abstract Factory-tinhoccoban.net


3. Cấu trúc mẫu thiết kế


Mẫu thiết kế này bao gồm các lớp sau:

AbstractFactory: Là một lớp định nghĩa một giao tiếp cho thao tác khởi tạo các "sản phẩm" ảo (AbstractProduct)
ConcreteFactory:Là các lớp thực thi giao tiếp AbstractFactory để tạo ra đối tượng cụ thể
AbstractProduct: Là một lớp định nghĩa một lớp ảo cho một loại đối tượng "sản phẩm"
Product:Là các lớp kế thừa từ từ lớp "sản phẩm" ảo AbstractProduct, các lớp Product định nghĩa từ đối tượng cụ thể
Client: sử dụng các lớp AbstractFactory và AbstractProduct trong hệ thống.

4. Ví dụ:


abstract class ThongTinNguoiHoc
{
    public abstract void Show();
}

abstract class MaNguoiHoc
{
 public abstract void Show();
}

abstract class Factory
{
 virtual public ThongTinNguoiHoc createThongTinNguoiHoc()
 {
  return null;
 }
 virtual public MaNguoiHoc createMaNguoiHoc()
 {
  return null;
 }
}
//Tạo sinh viên trường Đại học Thành Đô
class SinhVienDHThanhDo: ThongTinNguoiHoc

{
 public override void Show()
 {
  Console.WriteLine("Là sinh viên trường Đại học Thành Đô ");
 }
}

class ThanhDoID: MaNguoiHoc

{
 public override void Show()
 {
  Console.WriteLine("Mã sinh viên trường Đại học Thành Đô");
 }
}
//Tạo học sinh THPT
class HocSinhTruongTHPT: ThongTinNguoiHoc

{
 public override void Show()
 {
  Console.WriteLine("Là học sinh trường THPT ");
 }
}

class MaHocSinhTHPT: MaNguoiHoc

{
 public override void Show()
 {
  Console.WriteLine("Mã học sinh trường THTP");
 }
}
class SinhVienDHThanhDoFactory: Factory { public override ThongTinNguoiHoc createThongTinNguoiHoc() { return new SinhVienDHThanhDo(); } public override MaNguoiHoc createMaNguoiHoc() { return new ThanhDoID(); } }
class HocSinhTruongTHPTFactory: Factory
{
 public override ThongTinNguoiHoc createThongTinNguoiHoc()
 {
  return new HocSinhTruongTHPT();
 }
 public override MaNguoiHoc createMaNguoiHoc()
 {
  return new MaHocSinhTHPT();
 }
}
class Program { static void Main(string[] args) { Factory factory = new SinhVienDHThanhDoFactory(); ThongTinNguoiHoc thongtin = factory.createThongTinNguoiHoc(); MaNguoiHoc ma = factory.createMaNguoiHoc(); Console.WriteLine("Tạo đối tượng là một sinh viên Đại học Thành Đô"); thongtin.Show(); ma.Show(); factory = new HocSinhTruongTHPTFactory(); thongtin = factory.createThongTinNguoiHoc(); ma = factory.createMaNguoiHoc(); Console.WriteLine("Tạo đối tượng là một học sinh THPT"); thongtin.Show(); ma.Show(); Console.ReadKey(); } }

4. Áp dụng


- Phía client sẽ không phụ thuộc vào việc những sản phẩm được tạo ra như thế nào.
- Ứng dụng sẽ được cấu hình với một hoặc nhiều họ sản phẩm.
- Các đối tượng cần phải được tạo ra như một tập hợp để có thể tương thích với nhau
- Chúng ta muốn cung cấp một tập các lớp và chúng ta muốn thể hiện các ràng buộc, các mối quan hệ giữa chúng mà không phải là các thực thi của chúng(interface). Trong trường hợp không định nghĩa được các lớp trừu tượng Product thì việc tạo ra các ConcreteProduct theo mẫu này là rất khó hoặc không thể
- Mỗi khi có thêm một "sản phẩm" ta lại phải định nghĩa thêm một lớp "sản xuất"

Mới hơn Cũ hơn

Biểu mẫu liên hệ