1. 程式人生 > >qt(c++)之 工廠方法模式

qt(c++)之 工廠方法模式

轉載自:http://blog.csdn.net/liang19890820/article/details/70652858

簡述

工廠方法模式(Factory Method Pattern)是一種常用的物件建立型設計模式,此模式的核心思想是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、複用以及方便後期維護拓展的目的。

模式結構

UML 結構圖:

Factory Method Pattern

  • 抽象工廠(Factory):是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。
  • 具體工廠(ConcreteFactory):實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且被應用程式呼叫以建立產品物件。
  • 抽象產品(Product):所建立物件的基類,也就是具體產品的共同父類或共同擁有的介面。
  • 具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

優缺點

優點:

  • 克服了簡單工廠模式違背開放-封閉原則的缺點,又保留了封裝物件建立過程的優點,降低客戶端和工廠的耦合性。所以說,“工廠方法模式”是“簡單工廠模式”的進一步抽象和推廣。

缺點:

  • 每增加一個產品,相應的也要增加一個子工廠,加大了額外的開發量。

適用場景

  • 對於某個產品,呼叫者清楚地知道應該使用哪個具體工廠服務,例項化該具體工廠,生產出具體的產品來。
  • 只是需要一種產品,而不想知道也不需要知道究竟是哪個工廠生產的,即最終選用哪個具體工廠的決定權在生產者一方,它們根據當前系統的情況來例項化一個具體的工廠返回給使用者,而這個決策過程對於使用者來說是透明的。

案例分析

工廠模式基本和簡單工廠模式差不多,簡單工廠模式 - 在產品子類新增時,需要新增一個判斷分支,這違背了開放-封閉原則。因此,工廠模式就是為了解決這個問題而產生的。

BMW

所以,對於 簡單工廠模式 一節中的 BBA 來說,要分別由對應的工廠來生產。

程式碼實現

建立抽象產品

在我們的示例中,需要有一個汽車產品 - ICar:

// product.h
#ifndef PRODUCT_H
#define PRODUCT_H

#include <string>

using namespace std;

// 汽車介面
class ICar
{
public:
    virtual string Name() = 0;  // 汽車名稱
};

#endif // PRODUCT_H


建立具體產品

有了抽象產品,繼續為其建立一些具體的產品:

// concrete_product.h
#ifndef CONCRETE_PRODUCT_H
#define CONCRETE_PRODUCT_H

#include "product.h"

// 賓士汽車
class BenzCar : public ICar
{
public:
    string Name() {
        return "Benz Car";
    }
};

// 寶馬汽車
class BmwCar : public ICar
{
public:
    string Name() {
        return "Bmw Car";
    }
};

// 奧迪汽車
class AudiCar : public ICar
{
public:
    string Name() {
        return "Audi Car";
    }
};

#endif // CONCRETE_PRODUCT_H


建立工廠

產品有了,當然要有相應的工廠來生產,但在這之前,需要一個抽象工廠:

// factory.h
#ifndef FACTORY_H
#define FACTORY_H

#include "product.h"

// 工廠介面
class AFactory
{
public:
    virtual ICar* CreateCar() = 0;  // 生產汽車
};

#endif // FACTORY_H


建立具體工廠

為每個製造商建立對應的的工廠:

// concrete_factory.h
#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H

#include "factory.h"
#include "concrete_product.h"

// 賓士工廠
class BenzFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BenzCar();
    }
};

// 寶馬工廠
class BmwFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BmwCar();
    }
};

// 奧迪工廠
class AudiFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new AudiCar();
    }
};

#endif // CONCRETE_FACTORY_H

// factory.h
#ifndef FACTORY_H
#define FACTORY_H

#include "product.h"

// 工廠介面
class AFactory
{
public:
    virtual ICar* CreateCar() = 0;  // 生產汽車
};

#endif // FACTORY_H


建立具體工廠

為每個製造商建立對應的的工廠:

// concrete_factory.h
#ifndef CONCRETE_FACTORY_H
#define CONCRETE_FACTORY_H

#include "factory.h"
#include "concrete_product.h"

// 賓士工廠
class BenzFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BenzCar();
    }
};

// 寶馬工廠
class BmwFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new BmwCar();
    }
};

// 奧迪工廠
class AudiFactory : public AFactory
{
public:
    ICar* CreateCar() {
        return new AudiCar();
    }
};

#endif // CONCRETE_FACTORY_H


這樣以來,每個工廠只負責生產自己的產品。

建立客戶端

當一切準備就緒,就可以實現客戶端了:

// main.cpp
#include "concrete_factory.h"
#include "product.h"
#include <iostream>

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif

int main()
{
    // 賓士
    AFactory *pFactory = new BenzFactory();
    ICar *pCar = pFactory->CreateCar();
    cout << "Benz factory: " << pCar->Name() << endl;

    SAFE_DELETE(pCar);
    SAFE_DELETE(pFactory);

    // 寶馬
    pFactory = new BmwFactory();
    pCar = pFactory->CreateCar();
    cout << "Bmw factory: " << pCar->Name() << endl;

    SAFE_DELETE(pCar);
    SAFE_DELETE(pFactory);

    // 奧迪
    pFactory = new AudiFactory();
    pCar = pFactory->CreateCar();
    cout << "Audi factory: " << pCar->Name() << endl;

    SAFE_DELETE(pCar);
    SAFE_DELETE(pFactory);

    getchar();

    return 0;
}


輸出如下:

Benz factory: Benz Car
Bmw factory: Bmw Car
Audi factory: Audi Car

相關推薦

qtc++ 工廠方法模式

轉載自:http://blog.csdn.net/liang19890820/article/details/70652858 簡述 工廠方法模式(Factory Method Pattern)是一種常用的物件建立型設計模式,此模式的核心思想是封裝類中不變的部分,提取其中

《大話設計模式》Java程式碼示例工廠方法模式

工廠方法模式(Factory Method):定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類。 package factorymethod; /** * 工廠方法模式(Factory Method) * 雷鋒類 */

工廠方法模式-Factory Method Pattern 工廠三兄弟工廠方法模式工廠方法模式概述

2 工廠方法模式概述        在簡單工廠模式中只提供一個工廠類,該工廠類處於對產品類進行例項化的中心位置,它需要知道每一個產品物件的建立細節,並決定何時例項化哪一個產品類。簡單工廠模式最大的

設計模式2工廠方法模式

sys 實例化 不同 err reat inter 設計 end 泛型 工廠方法模式: ? 定義: ? 定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方

Java 設計模式工廠方法模式

參考連結:工廠方法模式-Factory Method Pattern 在介紹簡單工廠模式時提到簡單工廠模式存在一個很嚴重的問題,就是當系統中需要引入新產品時,如果靜態工廠方法是通過傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影

《大話設計模式》Java程式碼示例模板方法模式

模板方法模式:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 package templatemethod; /** * 模板方法模式(Template Method) *

單例模式singleton工廠方法模式factory,門面模式facade

CEmperor,需要單例的類 說明:很多大臣拜見的皇帝,只有一個。體現在面向物件方面,CEmperor定義一個靜態指標,和一個靜態函式,私有化建構函式、解構函式、建構函式複製、過載賦值語句。 注意:執行緒安全,採用互斥體的方式實現。 Public class Si

PHP設計模式系列工廠方法模式

工廠方法模式 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多型工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責

23種設計模式2工廠方法模式

定義:定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類。 型別:建立類模式 類圖: 工廠方法模式程式碼 interface IProduct { public void productMethod(); } class Pro

Java設計模式建立型模式工廠模式簡單工廠模式+工廠方法模式

在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說,許多型別物件的建立需要一系列的步驟:你可能需要計算或取得物件的初始位置;選擇生成哪個子物件例項;或在你生成你需要的物件

工廠三兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

工廠三兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

工廠三兄弟工廠方法模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

設計模式工廠方法模式java

1、概念 工廠方法模式(FACTORY METHOD)是一種常用的物件建立型設計模式,此模式的核心精神是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、複用和方便後期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;

iOS 設計模式工廠方法模式FactoryMethod

工廠方法模式克服了簡單工廠模式違背開放-封閉原則的缺點,保持了封裝物件建立過程的優點。 要更換物件時,無論用簡單工廠模式還是工廠方法模式,都可以不用做大的改動,就可以實現,降低樂樂客戶程式與產品物件的耦合。 工廠方法模式是簡單工廠模式的進一步抽象和推廣,缺點

程式碼設計模式工廠方法模式Factory Method

特點: 工廠方法是粒度很小的設計模式,因為模式的表現只是一個抽象的方法。提前定義用於建立物件的介面,讓子類決定例項化具體的某一個類,即在工廠和產品中間增加介面,工廠不再負責產品的建立,由介面針對不同條件返回具體的類例項,由具體類例項去實現。工廠方法模式是簡單工廠模式的衍生,

工廠三兄弟工廠方法模式:日誌記錄器的設計

簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影響已有程式碼?工廠方法模式應運而生,本文將介紹第二種工廠模式——

工廠方法模式-Factory Method Pattern 工廠三兄弟工廠方法模式:日誌記錄器的設計

簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由於靜態工廠方法通過所傳入引數的不同來建立不同的產品,這必定要修改工廠類的原始碼,將違背“開閉原則”,如何實現增加新產品而不影

工廠三兄弟工廠方法模式:日誌記錄器的工廠方法模式解決方案

3 完整解決方案 Sunny公司開發人員決定使用工廠方法模式來設計日誌記錄器,其基本結構如圖3所示: 在圖3中,Logger介面充當抽象產品,其子類FileLogger和DatabaseLogger充當具體產品,LoggerFactory介面充當抽象工廠

工廠方法模式-Factory Method Pattern 工廠三兄弟工廠方法模式:過載的工廠方法工廠方法的隱藏,工廠方法模式總結

5 過載的工廠方法        Sunny公司開發人員通過進一步分析,發現可以通過多種方式來初始化日誌記錄器,例如可以為各種日誌記錄器提供預設實現;還可以為資料庫日誌記錄器提供資料庫連線字串,為檔