工廠方法模式(Factory Method Pattern)是一種常用的設計模式,屬于創建型模式。它提供了一種創建對象的方式,而無需指定具體的類。工廠方法模式通過定義一個創建對象的接口,但由子類決定要實例化的類是哪一個。這使得類的實例化過程延遲到子類。
工廠方法模式的核心思想是將對象的創建過程與使用過程分離。通過定義一個工廠接口,具體的產品類由具體的工廠類來創建。這樣,客戶端代碼只需要依賴于工廠接口,而不需要知道具體的產品類。
工廠方法模式主要由以下幾個角色組成:
classDiagram
class Product {
<<interface>>
+use() void
}
class ConcreteProductA {
+use() void
}
class ConcreteProductB {
+use() void
}
class Creator {
<<interface>>
+factoryMethod() Product
}
class ConcreteCreatorA {
+factoryMethod() Product
}
class ConcreteCreatorB {
+factoryMethod() Product
}
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
Creator <|.. ConcreteCreatorA
Creator <|.. ConcreteCreatorB
ConcreteCreatorA --> ConcreteProductA
ConcreteCreatorB --> ConcreteProductB
// 抽象產品
interface Product {
void use();
}
// 具體產品A
class ConcreteProductA implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductA");
}
}
// 具體產品B
class ConcreteProductB implements Product {
@Override
public void use() {
System.out.println("Using ConcreteProductB");
}
}
// 抽象工廠
interface Creator {
Product factoryMethod();
}
// 具體工廠A
class ConcreteCreatorA implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductA();
}
}
// 具體工廠B
class ConcreteCreatorB implements Creator {
@Override
public Product factoryMethod() {
return new ConcreteProductB();
}
}
// 客戶端代碼
public class FactoryMethodPatternDemo {
public static void main(String[] args) {
Creator creatorA = new ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.use();
Creator creatorB = new ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.use();
}
}
use()
方法,所有具體產品類都需要實現這個方法。Product
接口,并提供了具體的use()
方法實現。factoryMethod()
方法,返回一個Product
類型的對象。Creator
接口,并提供了具體的factoryMethod()
方法實現,返回對應的具體產品對象。factoryMethod()
方法,獲取具體的產品對象,并調用其use()
方法。工廠方法模式適用于以下場景:
工廠方法模式在實際應用中,可以根據具體需求進行一些變體,常見的變體包括:
簡單工廠模式是工廠方法模式的一種簡化形式,它將工廠方法模式中的抽象工廠和具體工廠合并為一個工廠類,通過參數來決定創建哪種產品。
// 簡單工廠類
class SimpleFactory {
public static Product createProduct(String type) {
if ("A".equals(type)) {
return new ConcreteProductA();
} else if ("B".equals(type)) {
return new ConcreteProductB();
} else {
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 客戶端代碼
public class SimpleFactoryDemo {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.use();
Product productB = SimpleFactory.createProduct("B");
productB.use();
}
}
靜態工廠方法是將工廠方法定義為靜態方法,直接通過類名調用,而不需要創建工廠類的實例。
// 靜態工廠類
class StaticFactory {
public static Product createProductA() {
return new ConcreteProductA();
}
public static Product createProductB() {
return new ConcreteProductB();
}
}
// 客戶端代碼
public class StaticFactoryDemo {
public static void main(String[] args) {
Product productA = StaticFactory.createProductA();
productA.use();
Product productB = StaticFactory.createProductB();
productB.use();
}
}
多工廠方法是在一個工廠類中定義多個工廠方法,分別創建不同的產品。
// 多工廠類
class MultiFactory {
public Product createProductA() {
return new ConcreteProductA();
}
public Product createProductB() {
return new ConcreteProductB();
}
}
// 客戶端代碼
public class MultiFactoryDemo {
public static void main(String[] args) {
MultiFactory factory = new MultiFactory();
Product productA = factory.createProductA();
productA.use();
Product productB = factory.createProductB();
productB.use();
}
}
工廠方法模式是一種常用的設計模式,適用于對象的創建過程復雜、需要擴展產品類、需要解耦的場景。通過將對象的創建過程與使用過程分離,工廠方法模式提高了系統的靈活性和可維護性。在實際應用中,可以根據具體需求選擇不同的變體,如簡單工廠模式、靜態工廠方法、多工廠方法等。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。