1.模式定義
定義一個用于創建對象的接口,讓子類決定實例化哪一個類。Factory Method 使得一個類的實例化延遲到子類

2.使用場景
1.當你不知道改使用對象的確切類型的時候
2.當你希望為庫或框架提供擴展其內部組件的方法時
主要優點:
1.將具體產品和創建者解耦
2.符合單一職責原則
3.符合開閉原則
3.具體實現
3.1 代碼示例
簡單工廠:
// 簡單工廠
class SimpleFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ProductA();} else if ("B".equals(type)) {return new ProductB();} else {return null;}}
}
工廠方法
// 工廠方法
abstract class ProductFactory {/*** 創建產品** @return*/abstract Product createProduct();public Product getObject() {Product product = createProduct();return product;}
}class NonCreateProductA extends ProductFactory {@OverrideProduct createProduct() {return new ProductA();}
}class NonCreateProductB extends ProductFactory {@OverrideProduct createProduct() {return new ProductB();}
}
示例代碼
// 實例代碼
interface Product {String getName();
}class ProductA implements Product {@Overridepublic String getName() {return "Name's product A";}
}class ProductB implements Product {@Overridepublic String getName() {return "Name's product B";}
}
測試代碼
public class FactoryMethodTest {public static void main(String[] args) {// 簡單工廠測試代碼Product simpleA = SimpleFactory.createProduct("A");System.out.println(simpleA.getName());Product simpleB = SimpleFactory.createProduct("B");System.out.println(simpleB.getName());// 工廠方法測試代碼Product pa = new NonCreateProductA().getObject();System.out.println(pa.getName());Product pb = new NonCreateProductB().getObject();System.out.println(pb.getName());}}
3.2 源碼中的應用
// java api
// 靜態工廠方法
Calendar.getInstance()
java.text.NumberFormat.getInstance()
java.util.ResourceBundle.getBundle()// 工廠方法
java.net.URLStreamHandlerFactory
javax.xml.bind.JAXBContext.createMarshaller