抽象工廠模式:簡單的說,抽象工廠模式相對於工廠方法模式來講,就是工廠方法模式是針對一個產品系列的,而抽象工廠模式是針對多個產品系列的。在抽象工廠類中,客戶端不再需要進行對象的創建,而是具體的工廠類來進行創建,客戶端只負責對象的調用。
我們依舊以產品生產爲例,可以畫出如下抽象工廠模式生產的原理:
我們可以這樣想,ProductA和ProductB都有各自的生產屬性,即生產哪些內容。也即ProductA.java和ProductB.java。而生產ProductA和ProductB的工廠都需要一些特定的程序,也即方法。對應是FactoryMethod.java 。生產ProductA和ProductB中有兩個工廠可以供選擇,這兩個工廠都繼承生產A和B的方法。但是兩個工廠因生產工藝的差異導致生產出的A和B又不完全相同。所以又有1工廠生產的A和B,對應ConcreteF1ProductA.java 和ConcreteF1ProductB.java 2工廠生產的A和B對應ConcreteF2ProductA.java 和ConcreteF2ProductB.java。雖然兩個工廠生產的A和B工藝不同,但生產的A和B都有相同的屬性,所以生產中要繼承ProductA和ProductB。對於客戶選擇不同的代生產工廠,所以結果也不同。對應的是Client.java
根據原理可以寫如下示例:
ProductA.java
public interface ProductA {
public String doOperation(String txt);
}
ProductB.java
public interface ProductB {
public String doOperation(String txt);
}
FactoryMethod.java
public abstract class FactoryMethod {
protected abstract ProductA factoryMethodProductA();
protected abstract ProductB factoryMethodProductB();
public String operation(String txt){
ProductA productA =factoryMethodProductA();
ProductB productB =factoryMethodProductB();
return productA.doOperation(txt)+"---"+productB.doOperation(txt);
}
}
ConcreteF1ProductA.java
public class ConcreteF1ProductA implements ProductA{
public String doOperation(String txt){
return "代工廠1生產A產品"+txt;
}
}
ConcreteF1ProductB.java
public class ConcreteF1ProductB implements ProductB {
public String doOperation(String txt){
return "代工廠1生產B產品"+txt;
}
}
ConcreteFactory1Method.java
public class ConcreteFactory1Method extends FactoryMethod{
@Override
protected ProductA factoryMethodProductA() {
// TODO Auto-generated method stub
return new ConcreteF1ProductA();
}
protected ProductB factoryMethodProductB() {
// TODO Auto-generated method stub
return new ConcreteF1ProductB();
}
}
ConcreteF2ProductA.java
public class ConcreteF2ProductA implements ProductA {
public String doOperation(String txt){
return "代工廠2生產A產品"+txt;
}
}
ConcreteF2ProductB.java
public class ConcreteF2ProductB implements ProductB{
public String doOperation(String txt){
return "代工廠2生產B產品"+txt;
}
}
ConcreteFactory2Method.java
public class ConcreteFactory2Method extends FactoryMethod{
protected ProductA factoryMethodProductA() {
// TODO Auto-generated method stub
return new ConcreteF2ProductA();
}
protected ProductB factoryMethodProductB() {
// TODO Auto-generated method stub
return new ConcreteF2ProductB();
}
}
Client.java
public class Client {
public static void main(String[] args) {
FactoryMethod factoryMethod=new ConcreteFactory1Method();
System.out.println(factoryMethod.operation("測試"));
factoryMethod=new ConcreteFactory2Method();
System.out.println(factoryMethod.operation("測試"));
}
}
運行結果:
代工廠1生產A產品測試—代工廠1生產B產品測試
代工廠2生產A產品測試—代工廠2生產B產品測試