java設計模式---三種工廠模式

工廠模式提供建立對象的接口。java

工廠模式分爲三類:簡單工廠模式(Simple Factory), 工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory).
GOF在《設計模式〉中將工廠模式分爲兩類:工廠方法模式(Factory Method)和抽象工廠模式(Abstract Factory)。
設計模式

1. 簡單工廠模式(Simple Factory)
簡單工廠模式又叫作靜態工廠方法模式。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該建立哪個產品類(這些產品類繼承自一個父類或接口)的實例。
該模式中包含的角色及職責:
工廠(Creator)角色:它是簡單工廠模式的核心,負責實現建立全部實例的內部邏輯。工廠類能夠被外界直接調用,建立所須要的產品對象。
抽象產品角色:它負責描述全部實例所共有的公共接口。
具體產品角色:是簡單工廠模式的建立目標,全部建立的對象都是充當這個角色的某個具體類的實例。
ide

缺點:在工廠類中集中了全部實例的建立邏輯,違反了高內聚責任分配原則,將所有建立邏輯集中到了一個工廠類中;對系統的維護和擴展不利;設計

使用場景:負責建立的對象比較少;客戶只知道傳入工廠類的參數,對於如何建立對象的邏輯不關心;容易違反高內聚責任分配原則,因此只在很簡單的狀況下應用;code

類圖:對象

 

 

 

 

 

 

 

 

 

 

 

實例:繼承

//抽象產品角色  
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)角色:實現了抽象產品角色定義的接口,其具體產品有專門的具體工廠建立。
it

使用場景:
對於某個產品,調用者清楚知道應該使用哪一個具體工廠服務,實例化該具體工廠,生產出具體的產品來;
只是須要一種產品,對於那個工廠生產的並不關心,最終選用哪一個具體工廠由生產者一方決定,它根據當前系統的狀況來實例化一個具體的工廠返回給使用者,這個決策過程對於使用者來講是透明的。

 

類圖:

 

 

 

 

 

 

 

 

 

 

 

 

實例:

//抽象工廠  
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 AbstractFactory{  
  public AbstractProductA createProductA(){  
  return new ProductA2();  
  }  
  public AbstractProductB createProductB(){  
  return new ProductB2();  
  }  
}  
相關文章
相關標籤/搜索