Tải bản đầy đủ (.docx) (12 trang)

Báo Cáo Môn Học - Thiết Kế Phần Mềm Hướng Đối Tượng - Đề Tài - ABSTRACT FACTORY

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (333.17 KB, 12 trang )

ABSTRACT FACTORY
1. Khái niệm

- Abstract Factory, tên đầy đủ Abstract Factory
Pattern là một trong các Design Pattern thuộc nhóm
kiến tạo (Creational) được áp dụng khá phổ biến
trong khi thiết kế và lập trình. Nó cung cấp một giao
diện có chức năng tạo ra một tập các đối tượng có
quan hệ hoặc phụ thuộc nhau mà không cần chỉ rõ
các lớp cụ thể nào tại thời điểm thiết kế.
- Mẫu thiết kế Abstract Factory đóng gói một nhóm
những lớp đóng vai trò "sản xuất" (Factory) trong
ứng dụng, đây là những lớp được dùng để tạo ra các
đối tượng. Các lớp sản xuất này có chung một giao
diện được kế thừa từ một lớp cha thuần ảo gọi là
"lớp sản xuất ảo" (Abstract Factory).
- Người ta còn gọi Abstract Factory là “Factory of
factories”
2. Mục đích
1


- Cung cấp một giao diện để tạo ra các họ của các đối
tượng phụ thuộc hoặc liên quan đến nhau mà khơng
cần xác định chính xác các lớp thực hiện.
- Tạo ra đối tượng mà khơng cần biết chính xác kiểu
dữ liệu.
Ví dụ, ta đọc dữ liệu từ một file txt để lấy thông tin
tạo đối tượng. Trong file txt đó chứa một số nguyên.
Trong mã nguồn ta viết rằng, nếu dữ liệu đọc được
là số 1 thì tạo ra đối tượng A, nếu là 2 thì tạo ra đối


tượng B. Vậy rõ ràng, đối tượng của bạn chỉ được
tạo ra trong quá trình run time, nghĩa là trong lúc
bạn viết mã nguồn chương trình, bạn chưa xác định
được đối tượng mình cần tạo. Abstract Factory có
thể giúp bạn giải quyết vấn đề này.
- Giúp mã nguồn của bạn trở nên dễ dàng bảo trì nếu
có sự thay đổi.
Abstract Factory được hình dung như là một nhà
máy lớn chứa nhiều nhà máy con. Mỗi nhà máy con
2


là một Factory. Ta có thể sử dụng Abstract Factory
để tạo ra tất cả các đối tượng trong chương trình.
Khi ta sửa đổi hoặc thêm mới một đối tượng, các đối
tượng khác sẽ khơng bị ảnh hưởng.
3. Cấu trúc

Hình 1 : Cấu trúc của Abstract Factory
4. Các thành phần tham gia, ý nghĩa và vai trò
- AbstractFactory: định nghĩa một giao tiếp cho thao
tác khởi tạo các đối tượng ảo (AbstractProduct)

3


- ConcreteFactory: thực thi giao tiếp AbstractFactory
để tạo ra đối tượng cụ thể (ConcreteProduct)
- AbstractProduct: định nghĩa một lớp ảo cho một
loại đối tượng "sản phẩm" (Product).

- Product: kế thừa từ từ lớp “sản phẩm ảo”
(AbstractProduct), các lớp Product định nghĩa một
đối tượng cụ thể.
- Client: sử dụng các giao diện được khai báo bởi
AbstractFactory và AbstractProduct.
5. Tính chất đặc thù
- Không tạo chỉ 1 đối tượng mà tạo một tập các đối
tượng liên quan (tạo ra một Factory con khác)
- Abstract Factory Pattern, phương thức tạo đối tượng
(CreateObject()) không phụ thuộc vào yếu tố đầu
vào.

4


- Cung cấp phương thức hồn chỉnh (có thể tổng hợp
thành library) để sinh các đối tượng.
6. Tình huống áp dụng và các hệ quả
a. Tình huống áp dụng
- Một hệ thống được độc lập với sản phẩm của nó
được tạo ra, biên soạn, và trưng bày.
- Một hệ thống nên được cấu hình với một trong
nhiều dịng sản phẩm.
- Một nhóm của các đối tượng sản phẩm liên quan
được thiết kế để được sử dụng cùng nhau.
- Cung cấp một thư viện lớp của sản phẩm, chỉ để
lộ giao diện, khơng để lộ triển khai của họ.
b.Hệ quả
- Nó tách biệt các lớp cụ thể. Mẫu Abstract Factory
sẽ giúp bạn kiểm soát các lớp của các đối tượng

5


mà một ứng dụng tạo ra. Bởi vì một Factory đóng
gói các trách nhiệm và q trình tạo ra các đối
tượng Product, nó tách biệt các Client từ các lớp
thực hiện. Các Client thao tác các trường hợp
thông qua các giao diện trừu tượng của chúng.
Tên lớp Product được tách biệt trong quá trình
thực hiện của các Conrete Factory; chúng khơng
xuất hiện trong các đoạn code Client.
- Nó làm cho việc trao đổi các nhóm Product dễ
dàng. Các lớp học của Conrete Factory chỉ xuất
hiện một lần trong một ứng dụng, nghĩa là, nơi nó
được khởi tạo một lần. Điều này làm cho nó dễ
dàng để thay đổi các Concrete Factory trong một
ứng dụng sử dụng AbstractFactory. Nó có thể sử
dụng cấu hình Product khác nhau chỉ đơn giản
bằng cách thay đổi các Concrete Factory. Bởi vì
Abstract Factory tạo ra một nhóm đầy đủ các

6


Product, tồn bộ nhóm Product thay đổi cùng một
lúc.
- Nó thúc đẩy sự thống nhất giữa các Product. Khi
đối tượng Product trong một nhóm được thiết kế
để làm việc cùng nhau, điều quan trọng là một
ứng dụng sử dụng các đối tượng chỉ từ một nhóm

tại một thời điểm. Abstract Factory làm cho điều
này dễ dàng để thực thi.
- Hỗ trợ các loại Product mới là rất khó. Mở rộng
Abstract Factory để sản xuất ra các loại Product là
không dễ dàng. Đó là bởi vì giao diện Abstract
Factory gán cứng các nhóm Product có thể được
tạo ra. Hỗ trợ các loại Product mới đòi hỏi phải
mở rộng giao diện Factory, bao gồm việc thay đổi
lớp Abstract Factory và tất cả các lớp con của nó.
7. Ưu và khuyết điểm của Abstract Factory
a. Ưu điểm
7


- Phát triển thực thi một cách độc lập với các phần
cịn lại của ứng dụng thơng qua giao diện chung.
- Thúc đẩy sự thống nhất giữa các “sản phẩm”
(Product).
b.Khuyết điểm
- Khó dự đốn những vấn đề phát sinh trong tương
lai.
- Nếu AbstractProduct khơng đúng thì sẽ sinh ra
các ConcreteProduct khơng theo ý muốn.
- Rất khó để hỗ trợ một loại “sản phẩm” (Product)
mới
8. Các mẫu liên quan
- Factory Method, Factory Method dùng để thực
thi Abstract Factory. Trong cấu trúc của Abstract
Factory có chứa Factory Method. Trong hình 2, 2
phương


thức

CreateProductA()


8


CreateProductB() chính là Factory Method.
CreateProductA() chỉ sản xuất sản phẩm loại A,
CreateProductB() chỉ sản xuất sản phẩm loại B.

Factory Method

Hình 2: Factory Method in Abstract Factory
Sự khác biệt giữa Fatory Method và Abstract Factory
là : Factory Method là một nhà máy chỉ sản xuất 1
loại sản phẩm. Muốn sản xuất một loại sản phẩm
khác thì phải xây một nhà máy mới. Ví dụ trong
Hình 3, ta muốn thêm 1 loại sản phẩm Bottled
Drinking Water, thì ta phải thêm 1 Factory :: Bottled
9


Drinking Water kế thừa từ Factory, trong Factory ::
Bottled Drinking Water ta định nghĩa lại phương thức
BottledDrinkingWater(price: float)

Hình 3: Factory Method

Abstract Factory là một nhà máy có chứa nhiều mà
máy, mỗi nhà máy có thể sản xuất nhiều loại sản
phẩm. Như trong Hình 2 Muốn sản xuất một loại
sản phẩm mới, ví dụ ProductC, ta chỉ cần thêm vào
phương

thức

CreateProductC()

vào

AbstractFactory, và vào ConcreateFactory1 hoặc
ConcreateFactory2 hoặc cả ConcreateFactory1 và
ConcreateFactory2.
10


- Singletone sử dụng trong ConcreteFactory.
- Prototype sử dụng trong AbstractProduct.
9. Một số ví dụ

Hình 4: Mơ hình sản xuất điện thoại và máy tính

11


class OOSD

ContinentFactory

+
+
+

AfricaFactory
+
+
+

AnimalWorld

CreateCarnivore(): Carnivore
CreateHerbivore(): Herbivore
CreatePlant(): Plant

CreateCarnivore(): Carnivore
CreateHerbivore(): Herbivore
CreatePlant(): Plant

+
+
-

_carnivore: string = ""
_herbivore: string = ""
carnivore: Carnivore
herbivore: Herbivore
plant: Plant

+

+

AnimalWorld(ContinentFactory)
RunFoodChain(): void

AmericaFactory
+
+
+

CreateCarnivore(): Carnivore
CreateHerbivore(): Herbivore
CreatePlant(): Plant

Wolf
+

-herbivore

-plant

+

Grass

-carnivore

Herbivore

Plant


+

Carnivore

Eat(Plant): string

Bison

Tree

Eat(Plant): string

Eat(Herbivore): string

+

Lion

Wildebeest
+

Eat(Plant): string

Eat(Herbivore): string

+

Eat(Herbivore): string


Hình 5 : Mơ hình thế giới động vật

12



×