Thứ Hai, 25 tháng 2, 2013

Abstract Factory

1. Khái niệm

Abstract Factory cung cấp một interface dùng cho việc tạo ra các họ đối tượng có liên quan hoặc phụ thuộc nhau mà không cần xác định class thực tế của chúng.

2. Vấn đề thực tế

Trong trường hợp tạo ra 1 họ các sản phẩm, chúng ta có thể áp dụng Factory Method pattern, thế còn tạo ra nhiều họ sản phẩm có mối liên hệ với nhau, chúng ta sẽ làm thế nào? Bạn sẽ áp dụng Factory Method cho từng họ sản phẩm để tạo ra chúng? Như vậy chúng ta sẽ có nhiều interface  hoặc abtract class để có thể tạo ra nhiều họ sản phẩm tương ứng. Thế còn mối quan hệ giữa chúng thì sẽ thể hiện ở đâu?

Lấy ví dụ một cửa hàng bách hóa có bán nhiều loại sản phẩm như đồ chơi, thức ăn, quần áo...Đồ chơi là 1 họ sản phẩm, thức ăn cũng là 1 họ sản phẩm, quần áo cũng là 1 họ sản phẩm...Vậy nếu chúng ta áp dụng Factory Method cho từng họ sản phẩm như thế, liệu mối quan hệ của chúng với cửa hàng bách hóa sẽ như thế nào?

Abstract Factory ra đời để giải quyết bài toán cho việc tạo ra các họ sản phẩm có liên quan hoặc phụ thuộc nhau.

3. Giải pháp

Để giải quyết vấn đề trên, chúng ta có thể tạo ra một AbstractStoreFactory tổng quát để có thể tạo ra các họ sản phẩm như đồ chơi, thức ăn, quần áo ở mức trừu tượng. Sau đó, chúng ta lần lượt sẽ có các ConcreteStoreFactory để kế thừ AbstractStoreFactory nhằm tạo ra các sản phẩm tương ứng với từng họ trong thực tế. Toy, Food, Cloth sẽ là các họ sản phẩm (interface hoặc abstrac class), các sản phẩm thực tế tương ứng sẽ implement hoặc kế thừa từ họ sản phẩm để thực hiện các hành vi thực tế phù hợp.

4. Mô hình




5. Code sample


public interface ProductA {

}

public interface ProductB {

}

public class ProductA1 implements ProductA {

}

public class ProductA2 implements ProductA {

}

public class ProductB1 implements ProductB {

}

public class ProductB2 implements ProductB {

}

public class AbtractProductFactory {

 public abstract ProductA createProductA();

 public abstract ProductB createProductB();

}

public class Product1Factory extends AbtractProductFactory {

 public ProductA createProductA() {
  return new ProductA1();
 }

 public ProductB createProductB() {
  return new ProductB1();
 }

}

public class Product2Factory extends AbtractProductFactory {

 public ProductA createProductA() {
  return new ProductA2();
 }

 public ProductB createProductB() {
  return new ProductB2();
 }

}



6. Mối liên quan với các pattern khác

Không có nhận xét nào:

Đăng nhận xét