一、定義
工廠方法(FactoryMethod)模式的定義:定義一個創建產品對象的工廠接口,將產品對象的實際創建工作推遲到具體子工廠類當中。這滿足創建型模式中所要求的“創建與使用相分離”的特點。
應用實例: 1、您需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裏面的具體實現。 2、Hibernate 換數據庫只需換方言和驅動就可以。
二、優缺點
優點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程;
- 在系統增加新的產品時只需要添加具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則;
缺點:
- 每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統的複雜度。
三、代碼實現舉例
(1)創建一個接口
public interface Product {
public void show();
}
(2)創建實現接口的實體類
public class CreateProduct1 implements Product {
@Override
public void show() {
System.out.println("CreateProduct1 show!!!");
}
}
public class CreateProduct2 implements Product{
@Override
public void show() {
System.out.println("CreateProduct2 show!!!");
}
}
(3)創建一個工廠,生成基於給定信息的實體類的對象
public class ProductFactory {
public Product getProduct(String productType){
if (null == productType || productType.length() < 1){
return null;
}
if (productType.equalsIgnoreCase("PRODUCT1")){
return new CreateProduct1();
} else if (productType.equalsIgnoreCase("PRODUCT2")){
return new CreateProduct2();
}
return null;
}
}
(4)使用該工廠,通過傳遞類型信息來獲取實體類的對象
public class FactoryPatternDemo {
public static void main(String[] args) {
ProductFactory factory = new ProductFactory();
Product p1 = factory.getProduct("PRODUCT1");
Product p2 = factory.getProduct("PRODUCT2");
p1.show();
System.out.println("--------------------");
p2.show();
}
}
結果:
CreateProduct1 show!!!
--------------------
CreateProduct2 show!!!