天天看點

【設計模式總結】5、工廠模式——工廠方法模式

前面我們總結了簡單工廠,簡單工廠運用非常廣泛,但有局限性,适用于單使用者,即一個Client(相對于工廠的客戶),而一旦使用者多了就不再适用。

這裡我們引入工廠模式之工廠方法模式:

定義一個建立對象的接口,但由子類決定要執行個體化的類是哪一個。

工廠方法用來處理對象的建立,并将這樣的行為封裝在子類中。

類圖:

【設計模式總結】5、工廠模式——工廠方法模式

兩個子產品屬于平級的關系

這裡的createProduct方法就是工廠方法

clientA和B關注怎麼制作産品

這裡的生産者+消費者也叫建立者類(Creator)

代碼實作:

Client.java

public abstract class Client {
    public void orderProduct(String productName)
    {
        Product product = createProduct(productName);//調用工廠方法
        if (product == null)
            System.out.println("沒有該産品");
        else
            product.welcomeToUse();
    }

    protected abstract Product createProduct(String type);//工廠方法抽象

}
           

ClientA.java

public class ClientA extends Client{
    protected Product createProduct(String type)
    {//工廠方法實作
        Product product=null;

        if(type.equals("productA"))
            product = new ProductA();
        else if (type.equals("productB"))
            product = null 

        return product;
    }
}
           

ClientB.java

public class ClientB extends Client{
    protected Product createProduct(String type)
    {
        Product product=null;

        if(type.equals("productA"))
            product = null;
        else if (type.equals("productB"))
            product = new ClientBProductB();

        return product;
    }
}
           

Product.java

public abstract class Product {
    private String name;
    private String Price;
    abstract void welcomeToUse();
}
           

ClientAProductA.java

public class ClientAProductA extends Product {
    String name="productA";
    String price="12";
    void welcomeToUse()
    {
        System.out.println(name+":"+price);
    }
}
           

ClientBProductB.java

public class ClientBProductB extends Product {
    String name="productB";
    String price="14";
    void welcomeToUse()
    {
        System.out.println(name+":"+price+",并贈送你張1元消費券");
    }
}
           

測試代碼:

Client client1 = new ClientA();
        client1.orderProduct("productA");

        Client client2 = new ClientB();
        client2.orderProduct("productB");
           

運作結果:

【設計模式總結】5、工廠模式——工廠方法模式

總的來說相對于簡單工廠,工廠方法将SimpleProductFactory的功能封裝成了一個抽象方法,使得可以有多個Client使用,且能确定使用到具體的Client相對應的産品。相對于傳統方法,減少了對具體類的依賴,這裡引入新的設計原則,即要依賴抽象,不要依賴具體類,這條設計原則也叫依賴倒置原則。

下一節,工廠模式——抽象工廠模式

繼續閱讀