單工廠模式(Simple Factory Pattern)
工廠方法模式(Factory Method Pattern)
抽象工廠模式(Abstract Factory Pattern)
它們是三種與對象創建相關的設計模式,都屬于創建型模式,用于將對象的創建過程與使用過程分離,以提高代碼的可維護性和靈活性。下面對這三個模式進行講解:
1. 簡單工廠模式
(Simple Factory Pattern)
概念
簡單工廠模式由一個工廠類負責創建對象,根據參數決定要創建的具體類的實例。雖然它不是23種經典設計模式之一,但在實踐中非常常用。
特點
示例
// 產品接口
interface Product {
void use();
}
// 具體產品A
class ProductA implements Product {
public void use() {
System.out.println("Using Product A");
}
}
// 具體產品B
class ProductB implements Product {
public void use() {
System.out.println("Using Product B");
}
}
// 簡單工廠類
class SimpleFactory {
public static Product createProduct(String type) {
if (type.equals("A")) {
return new ProductA();
} else if (type.equals("B")) {
return new ProductB();
} else {
throw new IllegalArgumentException("Unknown product type");
}
}
}
// 客戶端
public class Client {
public static void main(String[] args) {
Product product=SimpleFactory.createProduct("A");
product.use(); // 輸出: Using Product A
}
}
優點
缺點
2. 工廠方法模式
(Factory Method Pattern)
概念
工廠方法模式通過定義一個創建對象的接口,由子類決定實例化哪一個類。工廠方法將對象的創建延遲到子類。
特點
示例
// 產品接口
interface Product {
void use();
}
// 具體產品A
class ProductA implements Product {
public void use() {
System.out.println("Using Product A");
}
}
// 具體產品B
class ProductB implements Product {
public void use() {
System.out.println("Using Product B");
}
}
// 工廠接口
interface Factory {
Product createProduct();
}
// 具體工廠A
class FactoryA implements Factory {
public Product createProduct() {
return new ProductA();
}
}
// 具體工廠B
class FactoryB implements Factory {
public Product createProduct() {
return new ProductB();
}
}
// 客戶端
public class Client {
public static void main(String[] args) {
Factory factory=new FactoryA();
Product product=factory.createProduct();
product.use(); // 輸出: Using Product A
}
}
優點
缺點
3. 抽象工廠模式
(Abstract Factory Pattern)
概念
抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們的具體類。它是一種在多個產品等級結構中擴展的工廠方法模式。
特點
示例
// 抽象產品A
interface ProductA {
void use();
}
// 抽象產品B
interface ProductB {
void operate();
}
// 具體產品A1
class ProductA1 implements ProductA {
public void use() {
System.out.println("Using Product A1");
}
}
// 具體產品A2
class ProductA2 implements ProductA {
public void use() {
System.out.println("Using Product A2");
}
}
// 具體產品B1
class ProductB1 implements ProductB {
public void operate() {
System.out.println("Operating Product B1");
}
}
// 具體產品B2
class ProductB2 implements ProductB {
public void operate() {
System.out.println("Operating Product B2");
}
}
// 抽象工廠接口
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具體工廠1
class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ProductA1();
}
public ProductB createProductB() {
return new ProductB1();
}
}
// 具體工廠2
class ConcreteFactory2 implements AbstractFactory {
public ProductA createProductA() {
return new ProductA2();
}
public ProductB createProductB() {
return new ProductB2();
}
}
// 客戶端
public class Client {
public static void main(String[] args) {
AbstractFactory factory=new ConcreteFactory1();
ProductA productA=factory.createProductA();
ProductB productB=factory.createProductB();
productA.use(); // 輸出: Using Product A1
productB.operate(); // 輸出: Operating Product B1
}
}
優點
缺點
總結
工廠方法模式,又稱工廠模式、多態工廠模式和虛擬構造器模式,通過定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象。
UML圖
假設你正在做跨平臺的UI設計,需要在Windows、Linux平臺使用。后續可能還會添加其他應用平臺。在設計UI控件時候就可以采用工廠方法模式。基礎對話框Dialog類使用不同的 UI 組件渲染窗口。 在不同的操作系統下, 這些組件外觀或許略有不同, 但其功能保持一致。 Windows 系統中的按鈕在 Linux 系統中仍然是按鈕。
//抽象基類-按鈕
class Button {
public:
virtual ~Button(){}
//渲染
virtual void render()=0;
//點擊
virtual void onClicked()=0;
};
//Windows平臺的按鈕
class WindowsButton : public Button {
public:
// 通過 Button 繼承
virtual void render() override
{
cout << "WindowsButton渲染完成" << endl;
}
virtual void onClicked() override
{
cout << "WindowsButton鼠標點擊" << endl;
}
};
//Linux平臺的按鈕
class LinuxButton : public Button {
public:
// 通過 Button 繼承
virtual void render() override
{
cout << "LinuxButton渲染完成" << endl;
}
virtual void onClicked() override
{
cout << "LinuxButton鼠標點擊" << endl;
}
};
//抽象基類-對話框
class Dialog {
public:
virtual ~Dialog() {}
void buttonTest() {
Button* button=creatButton();
button->render();
button->onClicked();
}
protected:
virtual Button* creatButton()=0;
};
class WindowsDialog: public Dialog {
public:
// 通過 Dialog 繼承
virtual Button* creatButton() override
{
return new WindowsButton;
}
};
class LinuxDialog : public Dialog {
public:
// 通過 Dialog 繼承
virtual Button* creatButton() override
{
return new LinuxButton;
}
};
int main(void) {
Dialog* windowDialog=new WindowsDialog;
windowDialog->buttonTest();
Dialog* linuxDialog=new LinuxDialog;
linuxDialog->buttonTest();
return 0;
}
簡單工廠模式(Simple Factory Pattern)是一種創建型設計模式,它專門定義一個類來負責創建其他類的實例。這種模式允許客戶端通過單一的接口創建多種類型的對象,而無需指定具體的類。簡單工廠模式的核心是一個工廠類,它包含了必要的邏輯來創建產品線中的產品對象。這些產品對象通常都具有共同的父類或接口。因為在簡單工廠模式中用于創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱為靜態工廠方法(Static Factory Method)模式。
抽象產品(Product)角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。可以包含一些公共代碼。
具體產品(Concrete Product)角色:是簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體類的實例。
工廠(Creator)角色:工廠類是簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象。在工廠類中提供一個創建產品的工廠方法,該方法可以根據所傳入的參數不同創建不同的具體產品對象。客戶端只需調用工廠類的工廠方法并傳入相應的參數即可得到一個產品對象。
UML類圖如下所示:
簡單工廠模式適用于以下場景: