Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: DesignPattern | Abstract Factory trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định DesignPattern | Abstract Factory trong lập trình C#

    Mô hình của nhc1987 có tên là composite thể hiện mối quan hệ cha - con.

    Cậu áp dụng cũng được.

    Mình nhớ tối hồi học OOP. Ông thầy có đưa ra bài toán tính tiền của 1 cái máy biết máy đó bao gồm các chi tiết đơn và chi tiết phức. Trong chi tiết phức lại có chi tiết đơn. Ỗng cài đặt cái mô hình này mà mình khâm phục miết đến giờ làm sao có thể tốt đến như vậy.

    Miết sau này mới biết nó là 1 mô hình chuẩn trong Pattern Object.
    ---------------------------------------
    Góp vui 1 chút nha:



    Đây là mô hình cơ bản và quan trọng trong Design Patterns tên là Abstract Factory.
    Visual C# Code:
    1.  // "AbstractFactory"
    2.   abstract class AbstractFactory
    3.   {
    4.     public abstract AbstractProductA CreateProductA();
    5.     public abstract AbstractProductB CreateProductB();
    6.   }
    7.   // "ConcreteFactory1"
    8.  
    9.   class ConcreteFactory1 : AbstractFactory
    10.   {
    11.     public override AbstractProductA CreateProductA()
    12.     {
    13.       return new ProductA1();
    14.     }
    15.     public override AbstractProductB CreateProductB()
    16.     {
    17.       return new ProductB1();
    18.     }
    19.   }
    20.  
    21.   // "ConcreteFactory2"
    22.  
    23.   class ConcreteFactory2 : AbstractFactory
    24.   {
    25.     public override AbstractProductA CreateProductA()
    26.     {
    27.       return new ProductA2();
    28.     }
    29.     public override AbstractProductB CreateProductB()
    30.     {
    31.       return new ProductB2();
    32.     }
    33.   }

    Visual C# Code:
    1.   // "AbstractProductA"
    2.  
    3.   abstract class AbstractProductA
    4.   {
    5.   }
    6.  
    7.   // "AbstractProductB"
    8.  
    9.   abstract class AbstractProductB
    10.   {
    11.     public abstract void Interact(AbstractProductA a);
    12.   }
    13.   // "ProductA1"
    14.  
    15.   class ProductA1 : AbstractProductA
    16.   {
    17.   }
    18.  
    19.   // "ProductB1"
    20.  
    21.   class ProductB1 : AbstractProductB
    22.   {
    23.     public override void Interact(AbstractProductA a)
    24.     {
    25.       Console.WriteLine(this.GetType().Name +
    26.         " interacts with " + a.GetType().Name);
    27.     }
    28.   }
    29.  
    30.   // "ProductA2"
    31.  
    32.   class ProductA2 : AbstractProductA
    33.   {
    34.   }
    35.  
    36.   // "ProductB2"
    37.  
    38.   class ProductB2 : AbstractProductB
    39.   {
    40.     public override void Interact(AbstractProductA a)
    41.     {
    42.       Console.WriteLine(this.GetType().Name +
    43.         " interacts with " + a.GetType().Name);
    44.     }
    45.   }

    Visual C# Code:
    1. class Client
    2.   {
    3.     private AbstractProductA AbstractProductA;
    4.     private AbstractProductB AbstractProductB;
    5.  
    6.     // Constructor
    7.     public Client(AbstractFactory factory)
    8.     {
    9.       AbstractProductB = factory.CreateProductB();
    10.       AbstractProductA = factory.CreateProductA();
    11.     }
    12.  
    13.     public void Run()
    14.     {
    15.       AbstractProductB.Interact(AbstractProductA);
    16.     }
    17.   }

    Visual C# Code:
    1. class MainApp
    2.   {
    3.     public static void Main()
    4.     {
    5.       // Abstract factory #1
    6.       AbstractFactory factory1 = new ConcreteFactory1();
    7.       Client c1 = new Client(factory1);
    8.       c1.Run();
    9.  
    10.       // Abstract factory #2
    11.       AbstractFactory factory2 = new ConcreteFactory2();
    12.       Client c2 = new Client(factory2);
    13.       c2.Run();
    14.  
    15.       // Wait for user input
    16.       Console.Read();
    17.     }
    18.   }

    Code thì copy lại đơn giản thôi. Nhưng mà hiểu được mô hình này thì các bạn sẽ nắm khoảng 70% nền tảng kiến thức của Design Patterns.

    Vậy nên mình đố các bạn có thể áp dụng nó vào chương trình của mình (chỉ cần nêu ý tưởng mà thôi).
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 31-05-2008 lúc 01:05 AM.

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    1

    We use the Abstract Factory design pattern when:
    - the system needs to be independent from the way the products it works with are created
    - the system is or should be configured to work with multiple families of products
    - a family of products is designed to work only all together
    - the creation of a library of products is needed, for which is relevant only the interface, not the implementation, too.

    The example at the beginning of the article can be extended to addresses, too. The AbstractFactory class will contain methods for creating a new entry in the information manager for a phone number and for an address, methods that produce the abstract products Address and PhoneNumber, which belong to AbstractProduct classes. The AbstractProduct classes will define methods that these products support: for the address get and set methods for the street, city, region and postal code members and for the phone number get and set methods for the number.
    The ConcreteFactory and ConcreteProduct classes will implement the interfaces defined above and will appear in our example in the form of the USAddressFactory class and the USAddress and USPhoneNumber classes. For each new country that needs to be added to the application, a new set of concrete-type classes will be added. This way we can have the EnglandAddressFactory and the EnglandAddress and EnglandPhoneNumber that are files for English address information.

    Another example, this time more simple and easier to understand, is the one of a pizza factory, which defines method names and returns types to make different kinds of pizza.
    The abstract factory can be named AbstractPizzaFactory, RomeConcretePizzaFactory and MilanConcretePizzaFactory being two extensions of the abstract class.
    The abstract factory will define types of toppings for pizza, like pepperoni, sausage or anchovy, and the concrete factories will implement only a set of the toppings, which are specific for the area and even if one topping is implemented in both concrete factories, the resulting pizzas will be different subclasses, each for the area it was implemented in.


    [source] http://hocit.com/forum/showthread.php?t=7541

  3. #3
    Ngày gia nhập
    05 2008
    Nơi ở
    Hà Nội
    Bài viết
    1

    Bác viết cũng được, đọc mô hình thì hiểu, nhưng để đọc code hiểu được thì phải mất một thời gian chứ đọc qua thì không thể hiểu luôn được, phải có thời gian.

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Đây là mô hình Patterns đầu tiên mà hình học được, và mình rất thích nó vì nó giúp mình hiểu thêm nhiều điều về thiết kế chương trình HĐT hơn. Ngoài ra vẫn còn các mẫu Patterns hay nữa như Singletion, Adapter, Observer...

    Mô hình Abstract Factory hiểu như là "nhà máy trừu tượng" sản xuất ra các "sản phẩm trừu tượng".

    Ví dụ như công ty A sản xuất sp Giấy và yêu cầu bạn viết chương trình quản lý ví dụ như thống kê các loại giấy và tính tổng giá trị...

    Bạn sẽ thiết kế như thế nào?
    Nghĩ đơn giản là:
    - 1 class NhaMay (Gồm các thuộc tính như tên công ty, các phương thức như inDanhSach(), tinhTong(),...)
    - và 1 class Giay (gồm các thuộc tính như Gia, các đặc tính, phương thức inThongTin(),....)

    OK! Và bạn hoàn toàn có thể thành công với yêu cầu đầu tiên là chương trình quản lý công ty A sản xuất Giấy. Mình tin là làm được điều đó.

    --------------------

    Nhưng nếu sau nay công ty A mở rộng thị trường, họ sản xuất thêm sản phẩm mực. Và yêu cầu ta cập nhật chương trình. Ta sẽ làm gì ???? sẽ viết lại chương trình à... hay sửa lại nhưng rất khó khăn.

    Rõ ràng bạn bị sai khi không thấy được hướng phát triển sau này của 1 ứng dụng

    Abstract Factory giải quyết vấn đề này bằng 1 lớp trừu tượng.
    Cả GiấyMực đều có 1 điểm chung là Sản Phẩm. Và vì vậy chúng sẽ được kế thừa từ sản phẩm.

    Và lúc này bản thiết kết sẽ như sau:
    Visual C# Code:
    1. // Const xác định loại sản phẩm
    2. public enum LoaiSanPham
    3. {
    4.     Giay,
    5.     Muc
    6. }
    7.  
    8. // Lớp trừu tượng SanPham
    9. {
    10.     string m_sTenSP;
    11.     int m_nGia;
    12.     protected LoaiSanPham m_loaiSP;
    13.  
    14.     // Property _TenSP
    15.     public string _TenSP
    16.     {
    17.         get { return m_sTenSP; }
    18.         set { m_sTenSP = value; }
    19.     }
    20.  
    21.     // Property _LoaiSP
    22.     public LoaiSanPham _LoaiSP
    23.     {
    24.         get { return m_nLoaiSP; }
    25.     }
    26.  
    27.     // Property _Gia
    28.     public int _Gia
    29.     {
    30.         get { return m_nGia; }
    31.         set { m_nGia = value; }
    32.     }
    33.  
    34.     // Hàm ảo giống In_Thong_Tin
    35.     public abstract void In_Thong_Tin();
    36. }
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 31-05-2008 lúc 01:07 AM.

  5. #5
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Và bạn sẽ có lớp SanPhamGiay, SanPhamMuc

    Visual C# Code:
    1. class SanPhamGiay : SanPham
    2. {
    3.     string m_sDactinhSP;
    4.  
    5.     public string _DactinhSP
    6.     {
    7.         get { return m_sDactinhSP; }
    8.         set { m_sDactinhSP = value; }
    9.     }
    10.  
    11.     public override void In_Thong_Tin()
    12.     {
    13.         Console.Write("Giay: {0} Loai: {1} Gia: {2} \n",
    14.             _TenSP,
    15.             _DacTinhSP,
    16.             _Gia);
    17.     }
    18.  
    19.     public SanPhamGiay()
    20.     {
    21.         m_loaiSP= LoaiSanPham.Giay;
    22.     }
    23. }
    24.  
    25. class SanPhamMuc : SanPham
    26. {
    27.     string m_sLoaiMuc;  
    28.     string m_sMauMuc;
    29.  
    30.     public string _LoaiMuc
    31.     {
    32.         get { return m_sLoaiMuc; }
    33.         set { m_sLoaiMuc = value; }
    34.     }
    35.  
    36.     public string _MauMuc
    37.     {
    38.         get { return m_sMauMuc; }
    39.         set { m_sMauMuc = value; }
    40.     }
    41.  
    42.     public override void In_Thong_Tin()
    43.     {
    44.         Console.Write("Muc: {0} Loai Muc: {1}  Mau Muc: {2}  Gia: {3} \n",
    45.             _TenSP,
    46.             _LoaiMuc,
    47.             _MauMuc,
    48.             _Gia);
    49.     }
    50.  
    51.     public SanPhamMuc()
    52.     {
    53.         m_loaiSP = LoaiSanPham.Muc;
    54.     }
    55. }
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 31-05-2008 lúc 12:54 AM.

  6. #6
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Mặc định DesignPattern | Abstract Factory trong lập trình C#

    Một câu hỏi là tại sao phải phức tạp như vậy...

    Một chương trình Hướng Đối Tượng nó có thể dài rất nhiều, nhưng cái hay là các function được tách nhỏ, và chắc chắn 1 hàm ko được dài quá 1 trang màn hình.

    Điều này sẽ giúp cho bạn dễ quản lý CODE sau này.

    Hơn nữa kế thừa giúp cho chương trình mở rộng.
    Giả sử Cty A có sản xuất thêm Sách, hay Cặp, ba lô... nữa cũng là chuyện nhỏ. Bạn chỉ cần kết thừa và tiếp tục.

    Với đặc điểm ĐA HÌNH của OOP thì như SanPham sẽ đại diện cho tất cả các lớp dẫn xuất kết thừa nó, vì thế class CongTy ko cần biết tới bất kỳ đối tượng SanPhamGiay, hoặc SanPhamMuc, hay các sản phẩm mà sau này nó sx nữa. Nó chỉ sử dụng lớp trừu tượng SanPham. Đó là ý nghĩa của ABSTRACT FACTORY, chúng ta sẽ ko bao giờ sửa code class CongTy dù sau này nó có mở rộng.

    Visual C# Code:
    1. class CongTy
    2. {
    3.     SanPham[] m_sanPham;
    4.     int m_SoSP;
    5.  
    6.     public CongTy()
    7.     {
    8.         m_SoSP = 0;
    9.         m_sanPham = new SanPham[300];
    10.     }
    11.  
    12.     public void San_Xuat(SanPham sp)
    13.     {
    14.         m_sanPham[m_SoSP] = sp;
    15.         m_SoSP++;
    16.     }
    17.  
    18.     public void In_Danh_Sach(LoaiSanPham lsp)
    19.     {
    20.         for (int i = 0; i < m_SoSP; i++)        
    21.             if (m_sanPham[i]._LoaiSP == lsp)
    22.                 m_sanPham[i].In_Thong_Tin();
    23.        
    24.     }
    25.  
    26.     public int Tinh_Tong(LoaiSanPham lsp)
    27.     {
    28.         int nTong= 0;
    29.  
    30.         for (int i = 0; i < m_SoSP; i++)        
    31.             if (m_sanPham[i]._LoaiSP == lsp)
    32.                 nTong += m_sanPham[i]._Gia;
    33.         return nTong;
    34.     }
    35. }
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 31-05-2008 lúc 01:11 AM.

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Abstract (trừu tượng) đã thể hiện ở class CongTy.

    Và bây giờ à class Client. Nó sẽ thực thi và điều khiển CongTy hoạt động.
    Visual C# Code:
    1. class Client
    2. {
    3.         CongTy m_congTy;
    4.        
    5.         public Client()
    6.         {
    7.             m_congTy = new CongTy();
    8.         }
    9.  
    10.         static void Main()
    11.         {
    12.                 SanPhamGiay giayA4 = new SanPhamGiay();
    13.                 giayA4._Gia = 100;
    14.                 giayA4._TenSP = "Giay A4";
    15.                 giayA4._DacTinhSP = "Trang";
    16.  
    17.  
    18.                 SanPhamGiay giayA3 = new SanPhamGiay();
    19.                 giayA4._Gia = 200;
    20.                 giayA4._TenSP = "Giay A3";
    21.                 giayA4._DacTinhSP = "Trang";
    22.  
    23.                 SanPhamGiay giayA2 = new SanPhamGiay();
    24.                 giayA4._Gia = 200;
    25.                 giayA4._TenSP = "Giay A2";
    26.                 giayA4._DacTinhSP = "Xam";
    27.  
    28.                 m_congTy.San_Xuat(giayA4);
    29.                 m_congTy.San_Xuat(giayA3);
    30.                 m_congTy.San_Xuat(giayA2);
    31.  
    32.                 ....
    33.         }
    34. }

    Hay có thể là
    Visual C# Code:
    1. // Sản xuất mực
    2.  
    3. SanPhamMuc mucIn = new SanPhamMuc();
    4. mucIn._Gia = 600;
    5. mucIn._TenSP = "Muc #1";
    6. mucIn._MauMuc = "Xanh";
    7.  
    8. SanPhamMuc mucViet = new SanPhamMuc();
    9. mucViet._Gia = 700;
    10. mucViet._TenSP = "Muc #2";
    11. mucViet._MauMuc = "Xanh";
    12.  
    13. m_congTy.San_Xuat(mucIn);
    14. m_congTy.San_Xuat(mucViet);
    15.  
    16.  
    17. // In danh sách
    18. m_congTy.In_Danh_Sach(LoaiSanPham.Giay);
    19. m_congTy.In_Danh_Sach(LoaiSanPham.Muc);

    Ở đây mình chỉ trừu tượng Sản phẩm.
    Abstract Factory còn trừu tượng cả Nhà máy nữa bởi vì các công ty như sản xuất xe, sản xuất điện tử đơn giản đều là nhà máy. Và họ có thể sử dụng ở mọi điều kiện.

    Hy vọng sẽ giúp ích cho các bạn!
    Cám ơn
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 31-05-2008 lúc 12:51 AM.

  8. #8
    Ngày gia nhập
    03 2009
    Bài viết
    12

    Mặc định Bài viết hay

    Bài viết của bạn rất hay. Cám ơn bạn.

Các đề tài tương tự

  1. Khi nào thì dùng design pattern như Abstract Factory , Factory Method , Singleton , Buider ....???
    Gửi bởi ngocsonaat trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 01-10-2013, 03:39 PM
  2. Bài tập về mẫu factory method và decorator trong lập trình C#?
    Gửi bởi princehai trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 28-02-2012, 08:52 PM
  3. Trong Objective C có Abstract class và Reflection hay không ?
    Gửi bởi ngocsonaat trong diễn đàn Thắc mắc lập trình Objective-C
    Trả lời: 14
    Bài viết cuối: 27-09-2011, 10:04 PM
  4. DesignPattern | Composite pattern trong lập trình C#
    Gửi bởi nhc1987 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 11
    Bài viết cuối: 04-05-2011, 07:15 AM
  5. Tài liệu Abstract trong C#
    Gửi bởi diendanit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 13-12-2010, 11:21 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn