一. 定義 提供一個建立一系列相關或互相依賴對象的接口, 而無需指定它們的具體類。
二. 結構
三. 參與者
Product (Fruit和Leaf兩個抽象産物) : 抽象生産者接口;
TreeFruit(樹上的水果)、 TreeLeaf(樹上的葉子)、 GroundFruit(地上的水果)、 GroundLeaf(地上的葉子) : 實際的自然産物;
NatureFactory: 抽象的自然制造工廠, 用于生産水果和葉子;
TreeFactory、 LeafFactory : 實際的自然制造工廠, 用于生産樹上或地上的水果和葉子。
四. 适用性
- 一個系統獨立(解耦)于它的産品的建立、 組合和表示時
- 一個系統要由多個它的産品的建立、組合(以上的自然界需要水果和葉子的組合)和表示時
- 強調一系列相關的産品對象的設計以便進行聯合使用時
- 提供一個産品庫, 而隻想顯示接口(面向接口程式設計)而不是實作時。
五. 具體實作
抽象工廠: 制造大自然中的葉子和水果
package com.wenniuwuren.abstractfactory;
/**
* 抽象工廠: 制造大自然中的葉子和水果
* @author wenniuwuren
*
*/
public interface NatureFactory {
public Fruit createFruit();
public Leaf createLeaf();
}
工廠實作類: 制造地面上的葉子和水果
package com.wenniuwuren.abstractfactory;
/**
* 工廠實作類: 制造地面上的葉子和水果
* @author wenniuwuren
*
*/
public class GroundFactory implements NatureFactory {
@Override
public Fruit createFruit() {
return new GroundFruit();
}
@Override
public Leaf createLeaf() {
return new GroundLeaf();
}
}
工廠實作類:制造樹上的水果和葉子
package com.wenniuwuren.abstractfactory;
/**
* 工廠實作類:制造樹上的水果和葉子
* @author wenniuwuren
*
*/
public class TreeFactory implements NatureFactory {
@Override
public Fruit createFruit() {
return new TreeFruit();
}
@Override
public Leaf createLeaf() {
return new TreeLeaf();
}
}
水果接口:
package com.wenniuwuren.abstractfactory;
/**
* 水果接口
* @author wenniuwuren
*
*/
public interface Fruit {
public String product();
}
水果實作類:地上的水果
package com.wenniuwuren.abstractfactory;
/**
* 水果實作類:地上的水果
* @author wenniuwuren
*
*/
public class GroundFruit implements Fruit {
@Override
public String product() {
return "GroundFruit";
}
}
水果實作類: 樹上的水果
package com.wenniuwuren.abstractfactory;
/**
* 水果實作類: 樹上的水果
* @author wenniuwuren
*
*/
public class TreeFruit implements Fruit {
@Override
public String product() {
return "TreeFruit";
}
}
葉子接口:
package com.wenniuwuren.abstractfactory;
/**
* 葉子接口
* @author wenniuwuren
*
*/
public interface Leaf {
public String product();
}
葉子實作類: 地上的葉子
package com.wenniuwuren.abstractfactory;
/**
* 葉子實作類: 地上的葉子
* @author wenniuwuren
*
*/
public class GroundLeaf implements Leaf {
@Override
public String product() {
return "GroundLeaf";
}
}
葉子實作類:樹上的葉子
package com.wenniuwuren.abstractfactory;
/**
* 葉子實作類:樹上的葉子
* @author wenniuwuren
*
*/
public class TreeLeaf implements Leaf {
@Override
public String product() {
return "TreeLeaf";
}
}
測試類:Client
package com.wenniuwuren.abstractfactory;
public class Client {
public static void main(String[] args) {
// 生産樹上的水果
//Fruit fruit = new TreeFruit(); //沒用抽象工廠時的調用方法
NatureFactory natureFactory = new TreeFactory();
Fruit fruit = natureFactory.createFruit();
System.out.println(fruit.product());
// 生産樹上的葉子
Leaf leaf = natureFactory.createLeaf();
System.out.println(leaf.product());
// 生産地上的水果
natureFactory = new GroundFactory();
fruit = natureFactory.createFruit();
System.out.println(fruit.product());
// 生産地上的葉子
leaf = natureFactory.createLeaf();
System.out.println(leaf.product());
}
}
測試結果:
TreeFruit
TreeLeaf
GroundFruit
GroundLeaf
本文可以和筆者的深入淺出設計模式 ------ Factory Method(工廠方法)參照着看, 可以區分這三個工廠模式的不同。
參考書籍:
《設計模式 : 可複用面向對象軟體的基礎》
《Effective Java》
《Head First 設計模式》