天天看點

設計模式之工廠方法模式及代碼示例

  1. 為什麼使用工廠方法

    一般建立對象的方式是new關鍵字來生成,但是這種方式必然地使得用戶端程式員的代碼和我們的對象産生了過于緊密的耦合,為了解除這樣的耦合狀态,提高用戶端代碼靈活性和可擴充性,使用工廠方法模式。

  2. 工廠方法模式

    用戶端代碼為了獲得對象,通過工廠對象生成,用戶端代碼隻需要給工廠執行個體發送建立對象的消息即可。

    1. 代碼示例

      現在我有如下的接口和類

      接口: 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;
        }
    }
}
           

“`

public class FactoryTest {

public static void main(String[] args) {
    //擷取工廠執行個體
    ProductFactory factory = new ProductFactory();
    //擷取指定類型産品
    Product product = factory.getProduct(EnumProductType.TYPE_A);
    //輸出産品資訊
    product.printName();
}
           

}

總結

優點:

通過代碼示例,我們可以看到,用戶端代碼需要得到産品對象時,通過工廠生成,而不必主動通過new關鍵字生成了,程式的可擴充增加了。

缺點:

雖然用戶端代碼和産品對象的建立解耦了,但是和工廠對象形成了耦合,并且如果産品新增了類型,還是需要修改工廠方法的分支判斷。

`

繼續閱讀