- 爲什麼使用工廠方法
一般創建對象的方式是new關鍵字來生成,但是這種方式必然地使得客戶端程序員的代碼和我們的對象產生了過於緊密的耦合,爲了解除這樣的耦合狀態,提高客戶端代碼靈活性和可擴展性,使用工廠方法模式。 - 工廠方法模式
客戶端代碼爲了獲得對象,通過工廠對象生成,客戶端代碼只需要給工廠實例發送創建對象的消息即可。
- 代碼示例
現在我有如下的接口和類
接口: Product 所有產品類都需要實現這個接口
類:ProductA、ProductB、ProductFactory、FactoryTest類
枚舉:EnumProductType
- 代碼示例
/***
* 接口類,作爲產品類的接口
* @author yjzhou
* 2016.03.17
*/
public interface Product {
public void printName();
}
/***
* A類型的產品
* @author yjzhou2
* 2016.03.17
*/
public class ProductA implements Product {
// 產品名稱
private String productName;
public ProductA() {
this.productName = "defaut name A";
}
public ProductA(final String productName) {
this.productName = productName;
}
@Override
public void printName() {
System.out.println(productName);
}
}
/***
* B類型的產品
* @author yjzhou2
* 2016.03.17
*/
public class ProductB implements Product {
// 產品名稱
private String productName;
public ProductB() {
this.productName = "defaut name B";
}
public ProductB(final String productName) {
this.productName = productName;
}
@Override
public void printName() {
System.out.println(productName);
}
}
/**
* 枚舉類,列舉產品類型
* @author yjzhou
* 2016.03.17
*/
public enum EnumProductType {
//產品類型 A
TYPE_A,
//產品類型B
TYPE_B;
}
/**
* 生產產品的工廠
* @author yjzhou
* 2016.03.17
*/
public class ProductFactory {
//用於存儲產品
private Product product;
/**
* 獲取相應類型的產品
* @param type 需要獲取的產品的類型
* @return 產品的實例對象
*/
public Product getProduct(final EnumProductType type){
createProduct(type);
return product;
}
/**
* 創建產品實例
* @param type 需要創建的類型
*/
private void createProduct(final EnumProductType type){
switch (type) {
case TYPE_A:{
product = new ProductA("你好,我是A類產品!");
break;
}
case TYPE_B:{
product = new ProductB("你好,我是B類產品!");
}
default:
product = null;
break;
}
}
}
“`
/**
* 工廠方法測試類
* @author yjzhou
* 2016.03.17
*/
public class FactoryTest {
public static void main(String[] args) {
//獲取工廠實例
ProductFactory factory = new ProductFactory();
//獲取指定類型產品
Product product = factory.getProduct(EnumProductType.TYPE_A);
//輸出產品信息
product.printName();
}
}
“
總結
優點:
通過代碼示例,我們可以看到,客戶端代碼需要得到產品對象時,通過工廠生成,而不必主動通過new關鍵字生成了,程序的可擴展增加了。
缺點:
雖然客戶端代碼和產品對象的創建解耦了,但是和工廠對象形成了耦合,並且如果產品新增了類型,還是需要修改工廠方法的分支判斷。
`