前面我們總結了簡單工廠,簡單工廠運用非常廣泛,但有局限性,适用于單使用者,即一個Client(相對于工廠的客戶),而一旦使用者多了就不再适用。
這裡我們引入工廠模式之工廠方法模式:
定義一個建立對象的接口,但由子類決定要執行個體化的類是哪一個。
工廠方法用來處理對象的建立,并将這樣的行為封裝在子類中。
類圖:
兩個子產品屬于平級的關系
這裡的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");
運作結果:
總的來說相對于簡單工廠,工廠方法将SimpleProductFactory的功能封裝成了一個抽象方法,使得可以有多個Client使用,且能确定使用到具體的Client相對應的産品。相對于傳統方法,減少了對具體類的依賴,這裡引入新的設計原則,即要依賴抽象,不要依賴具體類,這條設計原則也叫依賴倒置原則。
下一節,工廠模式——抽象工廠模式