Skip to content

Commit 370d851

Browse files
authored
translation: Localize abstract-factory pattern to Vietnamese (iluwatar#2186)
* localize abstract-factory to Vietnamese * fix yaml front matter
1 parent e6f5b69 commit 370d851

File tree

1 file changed

+230
-0
lines changed

1 file changed

+230
-0
lines changed
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
---
2+
title: Abstract Factory
3+
category: Creational
4+
language: vi
5+
tags:
6+
- Gang of Four
7+
---
8+
9+
## Còn được biết đến như
10+
11+
Kit
12+
13+
## Mục tiêu
14+
15+
Cung cấp giao diện (interface) để khởi tạo các đối tượng liên quan
16+
hoặc có phụ thuộc mà không cần chỉ định các lớp cụ thể của chúng.
17+
18+
## Giải thích
19+
20+
Nhà Máy Trừu Tượng (thuật ngữ tiếng Anh: Abstract Factory).
21+
22+
Ví dụ thực tế
23+
24+
> Để tạo ra một vương quốc, chúng ta cần các đối tượng có chủ đề chung. Vương quốc Elf cần một vị vua Elf, lâu đài Elf và quân đội Elf trong khi vương quốc Orc cần một vị vua Orc, lâu đài Orc và quân đội Orc. Các đối tượng trong vương quốc phụ thuộc lẫn nhau.
25+
26+
Một cách đơn giản
27+
28+
> Một nhà máy của nhiều nhà máy; một nhà máy nhóm các nhà máy riêng lẻ nhưng có liên quan hoặc phụ thuộc lại với nhau mà không chỉ định các lớp cụ thể của chúng.
29+
30+
Wikipedia viết (tạm dịch)
31+
32+
> Mẫu Nhà Máy Trừu Tượng cung cấp cách làm để đóng gói một nhóm các nhà máy riêng lẻ có chủ đề chung mà không cần chỉ định các lớp cụ thể của chúng
33+
34+
**Chương trình ví dụ**
35+
36+
Sử dụng ví dụ về vương quốc đã nêu ở trên.
37+
Trước hết, chúng ta có một số giao diện (interface) và lớp (class) được hiện thực hóa cho các đối tượng trong vương quốc.
38+
39+
```java
40+
public interface Castle {
41+
String getDescription();
42+
}
43+
44+
public interface King {
45+
String getDescription();
46+
}
47+
48+
public interface Army {
49+
String getDescription();
50+
}
51+
52+
// Hiện thực hóa tộc Elf ->
53+
public class ElfCastle implements Castle {
54+
static final String DESCRIPTION = "This is the elven castle!";
55+
@Override
56+
public String getDescription() {
57+
return DESCRIPTION;
58+
}
59+
}
60+
public class ElfKing implements King {
61+
static final String DESCRIPTION = "This is the elven king!";
62+
@Override
63+
public String getDescription() {
64+
return DESCRIPTION;
65+
}
66+
}
67+
public class ElfArmy implements Army {
68+
static final String DESCRIPTION = "This is the elven Army!";
69+
@Override
70+
public String getDescription() {
71+
return DESCRIPTION;
72+
}
73+
}
74+
75+
// Tương tự, hiện thực hóa tộc Orc -> ...
76+
77+
```
78+
79+
Sau đó, chúng ta có trừu tượng hóa và hiện thực hóa cho nhà máy vương quốc.
80+
81+
```java
82+
public interface KingdomFactory {
83+
Castle createCastle();
84+
King createKing();
85+
Army createArmy();
86+
}
87+
88+
public class ElfKingdomFactory implements KingdomFactory {
89+
90+
@Override
91+
public Castle createCastle() {
92+
return new ElfCastle();
93+
}
94+
95+
@Override
96+
public King createKing() {
97+
return new ElfKing();
98+
}
99+
100+
@Override
101+
public Army createArmy() {
102+
return new ElfArmy();
103+
}
104+
}
105+
106+
public class OrcKingdomFactory implements KingdomFactory {
107+
108+
@Override
109+
public Castle createCastle() {
110+
return new OrcCastle();
111+
}
112+
113+
@Override
114+
public King createKing() {
115+
return new OrcKing();
116+
}
117+
118+
@Override
119+
public Army createArmy() {
120+
return new OrcArmy();
121+
}
122+
}
123+
```
124+
125+
Bây giờ, chúng ta có Nhà Máy Trừu Tượng cho phép chúng ta tạo một nhóm các đối tượng liên quan, tức là nhà máy vương quốc Elf tạo ra lâu đài, vua và quân đội của tộc Elf, v.v.
126+
127+
```java
128+
var factory = new ElfKingdomFactory();
129+
var castle = factory.createCastle();
130+
var king = factory.createKing();
131+
var army = factory.createArmy();
132+
133+
castle.getDescription();
134+
king.getDescription();
135+
army.getDescription();
136+
```
137+
138+
Đầu ra khi chạy chương trình:
139+
140+
```java
141+
This is the elven castle!
142+
This is the elven king!
143+
This is the elven Army!
144+
```
145+
146+
Bây giờ, chúng ta có thể thiết kế một nhà máy cho các nhà máy vương quốc khác nhau. Trong ví dụ này, chúng tôi đã tạo `FactoryMaker`, chịu trách nhiệm trả về một thể hiện của` ElfKingdomFactory` hoặc `OrcKingdomFactory`.
147+
Người dùng có thể sử dụng `FactoryMaker` để tạo ra nhà máy mà họ mong muốn, sau đó, `FactoryMaker` sẽ tạo ra các đối tượng cụ thể (là dẫn xuất của `Army`, `King`, `Castle`).
148+
Trong ví dụ này, chúng tôi cũng sử dụng một enum để tham số hóa các loại nhà máy vương quốc mà khách hàng sẽ yêu cầu.
149+
150+
```java
151+
public static class FactoryMaker {
152+
153+
public enum KingdomType {
154+
ELF, ORC
155+
}
156+
157+
public static KingdomFactory makeFactory(KingdomType type) {
158+
switch (type) {
159+
case ELF:
160+
return new ElfKingdomFactory();
161+
case ORC:
162+
return new OrcKingdomFactory();
163+
default:
164+
throw new IllegalArgumentException("KingdomType not supported.");
165+
}
166+
}
167+
}
168+
169+
public static void main(String[] args) {
170+
var app = new App();
171+
172+
LOGGER.info("Elf Kingdom");
173+
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF));
174+
LOGGER.info(app.getArmy().getDescription());
175+
LOGGER.info(app.getCastle().getDescription());
176+
LOGGER.info(app.getKing().getDescription());
177+
178+
LOGGER.info("Orc Kingdom");
179+
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC));
180+
-- Tương tự với nhà máy Orc
181+
}
182+
```
183+
184+
## Sơ đồ lớp
185+
186+
![alt text](../../../abstract-factory/etc/abstract-factory.urm.png "Abstract Factory class diagram")
187+
188+
## Ứng dụng
189+
Sử dụng mẫu Nhà Máy Trừu Tượng khi
190+
191+
* Hệ thống nên độc lập với cách mà nó khởi tạo/kết hợp/trình bày sản phẩm của nó.
192+
* Hệ thống nên được cấu hình với một trong các họ sản phẩm.
193+
* Họ của các đối tượng sản phẩm được thiết kế để sử dụng cùng nhau, và bạn cần áp đặt ràng buộc này.
194+
* Bạn muốn cung cấp một thư viện lớp các sản phẩm, và bạn chỉ muốn tiết lộ giao diện (interface), ẩn giấu hiện thực hóa của chúng.
195+
* Thời gian tồn tại của đối tượng phụ thuộc thì ngắn hơn thời gian tồn tại của đối tượng sử dụng.
196+
* Bạn cần một/vài giá trị trong lúc chạy để khởi tạo một/vài đối tượng phụ thuộc cụ thể.
197+
* Bạn muốn quyết định sản phẩm nào được gọi từ một họ trong lúc chạy.
198+
* Bạn cần tính nhất quán giữa các sản phẩm.
199+
* Bạn không muốn sửa mã nguồn khi thêm những sản phẩm mới hoặc họ của các sản phẩm vào chương trình.
200+
201+
Ví dụ về ca sử dụng
202+
203+
* Lựa chọn để gọi đến hiện thực hóa phù hợp của FileSystemAcmeService hoặc DatabaseAcmeService hoặc NetworkAcmeService trong lúc thực thi.
204+
* Kiểm thử đơn vị trở nên cực kì dễ dàng.
205+
* Công cụ giao diện cho các hệ điều hành khác nhau.
206+
207+
## Hệ quả
208+
209+
* Sự tiêm phụ thuộc (dependency injection) trong Java che đậy các lớp dịch vụ phụ thuộc nên nó có thể dẫn tới lỗi trong quá trình thực thi, điều mà lẽ ra có thể bắt được trong quá trình biên dịch.
210+
* Trong khi mẫu này sử dụng hiệu quả với các đối tượng đã được định nghĩa sẵn, thêm một/vài đối tượng mới có thể sẽ khó khăn.
211+
* Mã nguồn trở nên phức tạp hơn do nó có thêm giao diện (interface) và lớp (class) được giới thiệu đi kèm theo mẫu.
212+
213+
## Hướng dẫn
214+
215+
* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java)
216+
217+
## Thông dụng
218+
219+
* [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html)
220+
* [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--)
221+
* [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--)
222+
223+
## Mẫu liên quan
224+
225+
* [Factory Method](https://java-design-patterns.com/patterns/factory-method/)
226+
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/)
227+
228+
## Tham khảo
229+
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
230+
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)

0 commit comments

Comments
 (0)