JAVA設計模式之 工廠方法模式【Factory Method Pattern】
一、概述
定義一個用於建立物件(Product)的工廠介面(Factory),讓子類(ProductFactoryA/ProductFactoryB)決定將哪一個類(ConcreteProductA/ConcreteProductB)例項化。工廠方法模式讓一個類的例項化延遲到其子類。提供一個抽象工廠介面來宣告抽象工廠方法,而由其子類來具體實現工廠方法,建立具體的產品物件,工廠方法模式是一種類建立型模式。
二、適用場景
(1) 客戶端不知道它所需要的物件的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品物件由具體工廠類建立;
(2) 抽象工廠類通過其子類來指定建立哪個物件。在工廠方法模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件;
三、UML類圖分析
四、參與者
(1) Product(抽象產品):它是定義產品的介面;
(2) ConcreteProduct(具體產品):
它實現了抽象產品介面,某種型別的具體產品由專門的具體工廠建立,具體工廠和具體產品之間一一對應。UML圖中的ConcreteProductA 和 ConcreteProductB 都是具體產品;
(3) Factory(抽象工廠):在抽象工廠類中,宣告瞭工廠方法(Factory Method),用於建立一個產品。抽象工廠是工廠方法模式的核心,所有建立物件的工廠類都必須實現該介面;
(4) ConcreteFactory(具體工廠):它是抽象工廠類的子類,實現了抽象工廠中定義的工廠方法,並可由客戶端呼叫,返回一個具體產品類的例項。UML圖中的ProductFactoryA 和 ProductFactoryB 都是具體工廠;
五、用例學習
(1) 產品介面:Product.java
/**
* 產品介面
* @author lvzb.software@qq.com
*
*/
public interface Product {
}
(2) 具體的產品A: ConcreteProductA.java
/**
* 具體的產品A
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductA implements Product {
public ConcreteProductA(){
System.out.println("產品A 已建立...");
}
}
(3) 具體的產品B: ConcreteProductB.java
/**
* 具體的產品B
* @author lvzb.software@qq.com
*
*/
public class ConcreteProductB implements Product {
public ConcreteProductB() {
System.out.println("產品B 已建立...");
}
}
(4) 建立產品的工廠介面:Factory.java
/**
* 建立產品的工廠介面
* @author lvzb.software@qq.com
*
*/
public interface Factory {
/**
* 建立具體產品實體的方法
* @return
*/
public Product createProduct();
}
(5) 具體的A產品工廠類:ProductFactoryA.java
/**
* 具體的A產品工廠類:只負責生產A產品(ConcreteProductA)
* @author lvzb.software@qq.com
*
*/
public class ProductFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
(6) 具體的B產品工廠類:ProductFactoryB.java
/**
* 具體的B產品工廠類:只負責生產B產品(ConcreteProductB)
* @author lvzb.software@qq.com
*
*/
public class ProductFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
(7) 負責呼叫工廠類生產產品的客戶端:Client.java
public class Client {
public static void main(String[] args) {
Factory factory = null;
factory = new ProductFactoryA();
Product productA = null;
productA = factory.createProduct();
factory = new ProductFactoryB();
Product productB = null;
productB = factory.createProduct();
}
}
(8) 執行結果如下:
產品A 已建立...
產品B 已建立...
六、其他/擴充套件/優缺點
工廠方法模式是對簡單工廠模式的設計優化,簡單工廠模式中 如果新增一類產品型別時,需要修改工廠靜態方法的產品建立邏輯,而使用工廠方法模式只需新擴充套件出一個新的工廠子類或是實現類來針對新增型別產品的建立工作、使系統具有了良好的擴充套件性與維護性;
下篇預告:小呂將學習和介紹 抽象工廠模式
相關文章
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 設計模式之工廠方法模式(FACTORY METHOD)設計模式
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- JAVA設計模式之 簡單工廠模式【Simple Factory Pattern】Java設計模式
- 設計模式(Design Patterns)工廠方法模式(Factory Method)設計模式
- C#設計模式系列:工廠方法模式(Factory Method)C#設計模式
- 設計模式系列之工廠模式三兄弟(Factory Pattern)設計模式
- 我所理解的設計模式(C++實現)——工廠方法模式(Factory Method Pattern)設計模式C++
- Java設計模式之工廠模式(Factory)Java設計模式
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式-抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式的征途—3.工廠方法(Factory Method)模式設計模式
- Factory Method 工廠方法模式(建立型模式)模式
- 使用C# (.NET Core) 實現簡單工廠(Simple Factory) 和工廠方法設計模式 (Factory Method Pattern)C#設計模式
- JAVA設計模式之 模板方法模式【Template Method Pattern】Java設計模式
- 設計模式實戰 – 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式實戰 - 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 【圖解設計模式系列】The Abstract Factory Pattern: 抽象工廠模式圖解設計模式抽象
- Java設計模式之工廠方法模式Java設計模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 簡單工廠模式(Simple Factory Pattern)模式
- 簡單工廠模式( Simple Factory Pattern )模式
- Java常用設計模式之工廠方法模式Java設計模式
- 《設計模式》 - 2. 工廠模式( Factory )設計模式
- 設計模式--工廠模式Factory(建立型)設計模式
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- java設計模式-工廠方法模式Java設計模式
- 設計模式之工廠方法模式設計模式
- Java設計模式之工廠模式Java設計模式
- Scala 與設計模式(四):Factory 工廠模式設計模式
- Java設計模式(工廠方法設計模式)Java設計模式
- Java程式設計之設計模式之工廠方法模式全解Java程式設計設計模式
- [Design Pattern With Go]設計模式-工廠模式Go設計模式
- Java設計模式(二):工廠方法模式Java設計模式
- Java設計模式3:工廠方法模式Java設計模式
- 我所理解的設計模式(C++實現)——抽象工廠模式(Abstract Factory Pattern)設計模式C++抽象
- golang設計模式之工廠方法模式Golang設計模式
- 設計模式系列之「工廠方法模式」設計模式