定義
定義一個用于創(chuàng)建對象的接口湿颅,讓子類決定實例化哪一個類。工廠方法讓一個類的實例化延遲到子類繁扎。
使用場景
在任何需要生成復雜的對象的地方,都可以使用工廠方法模式芹啥。
工廠方法結(jié)構(gòu)
1锻离、 UML圖
工廠方法模式.png
2 結(jié)構(gòu)說明
- Product: 定義工廠方法所要創(chuàng)建產(chǎn)品對象的接口。
- ConcreateProduct: 具體的產(chǎn)品對象墓怀,即Product的具體實現(xiàn)汽纠。
- Factory: 抽象工廠,工廠方法通常會返回一個Product類型的實例對象傀履,而且多是抽象的方法虱朵。
- ConcreateFactory:具體的工廠實現(xiàn)類莉炉。實現(xiàn)具體工廠的邏輯,返回具體的Product碴犬。
3絮宁、示例代碼
Product:
public abstract class Product {
public abstract void method();
}
ConcreateProduct1
public class ConcreateProduct1 extends Product {
@Override
public void method() {
System.out.println("產(chǎn)品一");
}
}
ConcreateProduct2
public class ConcreateProduct2 extends Product {
@Override
public void method() {
System.out.println("產(chǎn)品二");
}
}
Factory
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> c);
}
ConcreateFactory
public class ConcreateFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try {
product = (Product) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T)product;
}
}
調(diào)用:
public class ConcreateFactoryTest {
@Test
public void test(){
Factory factory = new ConcreateFactory();
//選擇具體的實現(xiàn)的任務延遲到子類來實現(xiàn)。
Product product = factory.createProduct(ConcreateProduct1.class);
//使用產(chǎn)品的接口,而無需關心具體的實現(xiàn)
product.method();
}
}
結(jié)果:
產(chǎn)品一
工廠方法優(yōu)缺點
優(yōu)點:
- 工廠方法模式可以在實現(xiàn)的時候使用產(chǎn)品的接口,而無需關心具體的實現(xiàn)服协,選擇具體的實現(xiàn)的任務延遲到子類來實現(xiàn)绍昂。
- 工廠方法更容易擴展新的產(chǎn)品。
缺點:
具體的產(chǎn)品對象和工廠方法耦合偿荷。在工廠方法模式中窘游,工廠方法是需要創(chuàng)建產(chǎn)品對象,也就需要選擇具體的產(chǎn)品對象跳纳,并創(chuàng)建它們的實例忍饰,因此耦合了。