定義:定義一個用於創建對象的接口,讓子類決定實例化哪個類,工廠方法使一個類的實例化延遲到子類。
其通用格式爲:
產品的接口
public interface Product {
void method();
}
具體產品
public class ConcreteProduct2 implements Product {
public void method() {
//具體處理
System.out.println("this is ConcreteProduct2");
}
}
public class ConcreteProduct1 implements Product {
public void method() {
//具體處理
System.out.println("this is ConcreteProduct1");
}
}
抽象工廠類
public abstract class Creator {
//創建Product
public abstract <T extends Product> T createProduct(Class<T> c);
}
具體工廠類
public class ConcreteCreator extends Creator {
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
//異常處理
}
return (T) product;
}
}
場景類
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
ConcreteProduct1 product = creator.createProduct(ConcreteProduct1.class);
// 具體業務處理
product.method();
}
}
優點
- 良好的封裝性,代碼結構清晰。創建產品只需要知道產品的類名即可,不用知道創建過程,降低模塊間的耦合度。
- 易於擴展。增加產品時只需要創建產品實現接口即可。
- 屏蔽產品。產品類實現如何變化調用者不需要關心,只需要關心產品的接口,只要產品接口不變化,系統中的上層模塊就不需要變化。