Mô hình Xưởng Sản Xuất là một trong những mô hình thiết kế thuộc loại tạo ra đối tượng. Trong mô hình này, quá trình tạo đối tượng được ẩn đi (bạn chỉ cần mua xe tại đại lý mà không cần biết cách sản xuất), thay vào đó sử dụng một giao diện chung để trỏ đến các đối tượng mới được tạo.
Tạo ra đối tượng
Những mô hình thiết kế này cung cấp cách để tạo đối tượng đồng thời ẩn đi logic tạo ra, thay vì sử dụng toán tử new trực tiếp. Điều này làm cho chương trình linh hoạt hơn khi quyết định cần tạo đối tượng nào dựa trên một trường hợp cụ thể.
Thực Hiện Mã
Chúng ta có thể sử dụng ví dụ về quốc tế hóa (i18n) đã đề cập trước đây.
Giao diện I18N
package com.example.i18n;
public interface I18N {
String greet();
}
Hai lớp thực hiện
Tiếng Anh
package com.example.i18n;
public class English implements I18N {
@Override
public String greet() {
return "Fight for your life";
}
}
Tiếng Trung
package com.example.i18n;
public class Chinese implements I18N {
@Override
public String greet() {
return "Đấu tranh vì cuộc sống";
}
}
Lớp Xưởng Sản Xuất
package com.example.i18n;
public class LanguageFactory {
public I18N createLanguage(String languageType) {
if (languageType == null) {
return null;
}
if ("English".equalsIgnoreCase(languageType)) {
return new English();
} else if ("Chinese".equalsIgnoreCase(languageType)) {
return new Chinese();
}
return null;
}
}
Lớp Khách Hàng
package com.example.i18n;
public class ClientApp {
public static void main(String[] args) {
LanguageFactory factory = new LanguageFactory();
I18N englishVersion = factory.createLanguage("English");
System.out.println(englishVersion.greet());
I18N chineseVersion = factory.createLanguage("Chinese");
System.out.println(chineseVersion.greet());
}
}
Bạn cũng có thể sử dụng kỹ thuật phản chiếu và tệp cấu hình để tạo động đối tượng.
Tệp cấu hình config.properties
language=com.example.i18n.English
Lớp Sử Dụng
package com.example.i18n;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Properties;
public class DynamicApp {
public static void displayGreeting() {
Properties properties = new Properties();
String configFilePath = DynamicApp.class.getResource("/config.properties").getPath();
try {
configFilePath = URLDecoder.decode(configFilePath, "UTF-8");
properties.load(new FileInputStream(configFilePath));
String languageClassName = properties.getProperty("language");
I18N i18n = (I18N) Class.forName(languageClassName).newInstance();
System.out.println(i18n.greet());
} catch (IOException | IllegalAccessException | InstantiationException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
displayGreeting();
}
}
Mô hình này được sử dụng rộng rãi trong các khung hỗ trợ cấu hình bằng XML như MyBatis và Spring.