工廠模式分為三類:簡單工廠模式(Simple Factory), 工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory).
GOF在《設計模式〉中將工廠模式分為兩類:工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory)。
1. 簡單工廠模式(Simple Factory)
簡單工廠模式又叫做靜態工廠方法模式。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。
該模式中包含的角色及職責:
工廠(Creator)角色:它是簡單工廠模式的核心,負責實現創建所有實例的內部邏輯。工廠類可以被外界直接調用,創建所需要的產品對象。
抽象產品角色:它負責描述所有實例所共有的公共接口。
具體產品角色:是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。
缺點:在工廠類中集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;對系統的維護和擴展不利;
使用場景:負責創建的對象比較少;客戶只知道傳入工廠類的參數,對於如何創建對象的邏輯不關心;容易違反高內聚責任分配原則,所以只在很簡單的情況下應用;
類圖:

實例:
//抽象產品角色
public interface IProduct
{
public void saleProduct();
}
//具體產品角色
public class Product_A implements IProduct
{
@Override
public void saleProduct(){
...
}
}
//具體產品角色
public class Product_B implements IProduct
{
@Override
public void saleProduct(){
...
}
}
//工廠角色
public class Creator
{
public IProduct createProduct(int productFlag){
switch(productFlag){
case 1:
return new Product_A();
case 2:
return new Product_B();
default:
return null;
}
}
}
2. 工廠方法模式(Factory Method)
工廠方法模式是簡單工廠方法模式的衍生,它的核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,使得系統可以在不修改具體工廠角色的情況下引用新的產品。
在這個模式中,一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品。
工廠方法模式是最典型的模板方法模式(Template Method Pattern)應用。
抽象工廠(Creator)角色:工廠方法模式的核心,任何在模式中創建的對象的工廠必須實現這個接口。
具體工廠(Concrete Creator)角色:實現抽象工廠接口的具體工廠類,包含應用程序的邏輯。
抽象產品(Product)角色:產品對象的共同父類或共同擁有的接口。
具體產品(Concrete Product)角色:實現了抽象產品角色定義的接口,其具體產品有專門的具體工廠創建。
使用場景:
對於某個產品,調用者清楚知道應該使用哪個具體工廠服務,實例化該具體工廠,生產出具體的產品來;
只是需要一種產品,對於那個工廠生產的並不關心,最終選用哪個具體工廠由生產者一方決定,它根據當前系統的情況來實例化一個具體的工廠返回給使用者,這個決策過程對於使用者來說是透明的。

實例:
//抽象工廠
public interface Creator{
public Light factory();
}
//抽象產品
public interface Light{
public void TurnOn();
public void TrunOff();
}
//具體產品
public class BullbLight implements Light{
public void TurnOn(){
}
public void TrunOff(){
}
}
//具體產品
public class TubeLight implements Light{
public void TurnOn(){
}
public void TrunOff(){
}
}
//具體工廠
public class BullbCreator implements Creator{
public Light factory(){
return new BullbLight();
}
}
//具體工廠
public class TubeCreator implements Creator{
public Light factory(){
return new TubeLight();
}
}
public class Client{
public static void main(String[] args){
Creator create = new BullbCreator();
Light bullbLight = create.factory();
bullbLight.TurnOn();
Creator create1 = new TubeCreator();
Light tubebLight = create.factory();
tubebLight.TurnOn();
}
}
3. 抽象工廠模式(Abstract Factory)
抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產品的具體情況下,創建多個產品族中的產品對象。
實例:
//抽象工廠角色
public interface AbstractFactory{
public ProductA createProductA();
public ProductB createProductB();
}
//抽象產品類A
public interface AbstractProductA
{
}
//抽象產品類B
public interface AbstractProductB
{
}
//具體產品類ProdcutA1
public class ProductA1 implements AbstractProductA
{
public ProductA1()
{
}
}
//具體產品類ProdcutA2
public class ProductA2 implements AbstractProductA
{
public ProductA2()
{
}
}
//具體產品類ProductB1
public class ProductB1 implements AbstractProductB
{
public ProductB1()
{
}
}
//具體產品類ProductB2
public class ProductB2 implements AbstractProductB
{
public ProductB2()
{
}
}
//具體工廠類1
public class ConcreteFactory1 implements AbstractFactory{
public AbstractProductA createProductA(){
return new ProductA1();
}
public AbstractProductB createProductB(){
return new ProductB1();
}
}
//具體工廠類2
public class ConcreteFactory2 implements Creator{
public AbstractProductA createProductA(){
return new ProductA2();
}
public AbstractProductB createProductB(){
return new ProductB2();
}
}