国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——抽象工廠模式 C++實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——抽象工廠模式 C++實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來把你整個(gè)房間給污染掉。

設(shè)計(jì)思想

提供一個(gè)接口,讓該接口負(fù)責(zé)創(chuàng)建一系列“相關(guān)或者相互依賴的對(duì)象”,無需指定他們具體的類。

動(dòng)機(jī)

在軟件系統(tǒng)中,經(jīng)常面臨著“一系列相互依賴的對(duì)象”的創(chuàng)建工作;同時(shí),由于需求的變化,往往存在更多系列對(duì)象的創(chuàng)建工作。

如何應(yīng)對(duì)這種變化?如何繞過常規(guī)的對(duì)象創(chuàng)建方法(new),提供一種“封裝機(jī)制”來避免客戶程序和這種“多系列具體對(duì)象創(chuàng)建工作”的緊耦合?

如果沒有應(yīng)對(duì)“多系列對(duì)象構(gòu)建”的需求變化,則沒有必要使用Abstract Factory模式,這時(shí)候使用簡單的工廠完全可以。

“系列對(duì)象”指的是在某一特定系列下的對(duì)象之間有相互依賴或作用關(guān)系。不同系列的對(duì)象之間不能相互依賴。

Abstract Factory模式主要在于應(yīng)對(duì)“新系列”的需求變動(dòng)。其缺點(diǎn)在于難以應(yīng)對(duì)“新對(duì)象”的需求變動(dòng)。

抽象工廠和工廠方法非常相像,區(qū)別就在于抽象工廠需要一系列對(duì)應(yīng)的對(duì)象,而工廠方法就是唯一對(duì)象,因此工廠方法也可以理解成抽象工廠的一個(gè)特例。

業(yè)務(wù)場景

要對(duì) SQL Server 數(shù)據(jù)庫進(jìn)行操作,需要有 Connection,Command,DataReader等一系列配套的操作。而當(dāng)需要更換數(shù)據(jù)庫的時(shí)候,也是這套操作

如何提高代碼復(fù)用性

一個(gè)非常直觀的思路是:

class EmployeeDAO {
public:
    vector<EmployeeDO> GetEmployees() {
        SqlConnection* connection = new SqlConnection();
        connection->ConnectionString("...");

        SqlCommand* command = new SqlCommand();
        command->CommandText("...");
        command->SetConnection(connection);

        SqlDataReader* reader = command->ExecuteReader();
        while (reader->Read()) {
        }
    }
};

看見這些熟悉的代碼:

 SqlConnection* connection = new SqlConnection();
 SqlCommand* command = new SqlCommand();

如果你看過前面的工廠方法模式,你會(huì)很自然的聯(lián)想到那個(gè),然后將代碼改進(jìn)成這樣:

// 數(shù)據(jù)庫訪問有關(guān)的基類
class IDBConnection {};
class IDBConnectionFactory {
public:
    virtual IDBConnection* CreateDBConnection() = 0;
};

class IDBCommand {};
class IDBCommandFactory {
public:
    virtual IDBCommand* CreateDBCommand() = 0;
};

class IDataReader {};
class IDataReaderFactory {
public:
    virtual IDataReader* CreateDataReader() = 0;
};

// 支持SQL Server
class SqlConnection : public IDBConnection {};
class SqlConnectionFactory : public IDBConnectionFactory {};

class SqlCommand : public IDBCommand {};
class SqlCommandFactory : public IDBCommandFactory {};

class SqlDataReader : public IDataReader {};
class SqlDataReaderFactory : public IDataReaderFactory {};

// 支持Oracle
class OracleConnection : public IDBConnection {};
class OracleConnectionFactory : public IDBConnectionFactory {};

class OracleCommand : public IDBCommand {};
class OracleCommandFactory : public IDBCommandFactory {};

class OracleDataReader : public IDataReader {};
class OracleDataReaderFactory : public IDataReaderFactory {};

class EmployeeDAO {
    IDBConnectionFactory* dbConnectionFactory;
    IDBCommandFactory* dbCommandFactory;
    IDataReaderFactory* dataReaderFactory;

public:
    vector<EmployeeDO> GetEmployees() {
        IDBConnection* connection = dbConnectionFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command = dbCommandFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection);  // 關(guān)聯(lián)性

        IDBDataReader* reader = command->ExecuteReader();  // 關(guān)聯(lián)性
        while (reader->Read()) {
        }
    }
};

有沒有解決問題呢?確實(shí)解決了,但是如果細(xì)心一點(diǎn),你會(huì)發(fā)現(xiàn):這三個(gè)工廠實(shí)例化出來的對(duì)象應(yīng)該是一套的:SQL只能用SQL的connection,command以及dataReader,MYSQL只能用MYSQL的,也就是說在構(gòu)造EmployeeDAO的時(shí)候,雖然需要傳入三個(gè)工廠對(duì)象:dbConnectionFactory,dbCommandFactory,dataReaderFactory,但是這三個(gè)對(duì)象卻必須是一套的,這就帶來了問題:1. 用戶有可能傳錯(cuò)對(duì)象;2.既然必須是一套的,那么完全可以將其封裝成一個(gè)對(duì)象傳進(jìn)來

于是,便有了抽象工廠模式:將三個(gè)配套的操作再封裝成一個(gè)類,避免產(chǎn)生配套錯(cuò)誤文章來源地址http://www.zghlxwxcb.cn/news/detail-693783.html

代碼案例

// 數(shù)據(jù)庫訪問有關(guān)的基類
class IDBConnection {};

class IDBCommand {};

class IDataReader {};

// 三個(gè)操作,綁定到一起
// 此處是這個(gè)模式的穩(wěn)定部分
class IDBFactory {
public:
    virtual IDBConnection* CreateDBConnection() = 0;
    virtual IDBCommand* CreateDBCommand() = 0;
    virtual IDataReader* CreateDataReader() = 0;
};

// 支持SQL Server
class SqlConnection : public IDBConnection {};
class SqlCommand : public IDBCommand {};
class SqlDataReader : public IDataReader {};

class SqlDBFactory : public IDBFactory {
public:
    virtual IDBConnection* CreateDBConnection() = 0;
    virtual IDBCommand* CreateDBCommand() = 0;
    virtual IDataReader* CreateDataReader() = 0;
};

// 支持Oracle
class OracleConnection : public IDBConnection {};
class OracleCommand : public IDBCommand {};
class OracleDataReader : public IDataReader {};

class OracleDBFactory : public IDBFactory {
public:
    virtual IDBConnection* CreateDBConnection() = 0;
    virtual IDBCommand* CreateDBCommand() = 0;
    virtual IDataReader* CreateDataReader() = 0;
};

class EmployeeDAO {
    // 保證是同一個(gè)工廠
    // 是一個(gè) family
    IDBFactory* dbFactory;

public:
    vector<EmployeeDO> GetEmployees() {
        IDBConnection* connection = dbFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command = dbFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection);  // 關(guān)聯(lián)性

        IDBDataReader* reader = command->ExecuteReader();  // 關(guān)聯(lián)性
        while (reader->Read()) {
        }
    }
};

到了這里,關(guān)于【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——抽象工廠模式 C++實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——觀察者模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來把你整個(gè)房間給污染掉。 主題對(duì)象(出版者)管理某些數(shù)據(jù),當(dāng)主題內(nèi)的數(shù)據(jù)改變,就會(huì)通知觀察者(訂閱者)。

    2024年02月10日
    瀏覽(27)
  • 抽象工廠設(shè)計(jì)模式go實(shí)現(xiàn)嘗試

    本文章嘗試使用go實(shí)現(xiàn)“抽象工廠”。 新人設(shè)計(jì)模式理解,望大家多多指點(diǎn)。

    2024年02月16日
    瀏覽(21)
  • 【Head First 設(shè)計(jì)模式】-- 觀察者模式

    【Head First 設(shè)計(jì)模式】-- 觀察者模式

    客戶有一個(gè)WeatherData對(duì)象,負(fù)責(zé)追蹤溫度、濕度和氣壓等數(shù)據(jù)?,F(xiàn)在客戶給我們提了個(gè)需求,讓我們利用WeatherData對(duì)象取得數(shù)據(jù),并更新三個(gè)布告板:目前狀況、氣象統(tǒng)計(jì)和天氣預(yù)報(bào)。 WeatherData對(duì)象提供了4個(gè)接口: getTemperature():獲取溫度 getHumidity():獲取濕度 getPressure():獲

    2024年02月05日
    瀏覽(16)
  • 用Rust實(shí)現(xiàn)23種設(shè)計(jì)模式之抽象工廠

    在 Rust 中,可以使用 trait 和泛型來實(shí)現(xiàn)抽象工廠模式。抽象工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一個(gè)接口來創(chuàng)建一系列相關(guān)或依賴對(duì)象的家族,而無需指定具體的類。下面是一個(gè)簡單的示例,展示了如何使用 Rust 實(shí)現(xiàn)抽象工廠模式: 在上述示例中,我們首先定義了抽

    2024年02月14日
    瀏覽(31)
  • [設(shè)計(jì)模式Java實(shí)現(xiàn)附plantuml源碼~創(chuàng)建型] 產(chǎn)品族的創(chuàng)建——抽象工廠模式

    [設(shè)計(jì)模式Java實(shí)現(xiàn)附plantuml源碼~創(chuàng)建型] 產(chǎn)品族的創(chuàng)建——抽象工廠模式

    前言: 為什么之前寫過Golang 版的設(shè)計(jì)模式,還在重新寫 Java 版? 答:因?yàn)閷?duì)于我而言,當(dāng)然也希望對(duì)正在學(xué)習(xí)的大伙有幫助。Java作為一門純面向?qū)ο蟮恼Z言,更適合用于學(xué)習(xí)設(shè)計(jì)模式。 為什么類圖要附上uml 因?yàn)楹芏嗳藢W(xué)習(xí)有做筆記的習(xí)慣,如果單純的只是放一張圖片,那

    2024年01月22日
    瀏覽(23)
  • 自學(xué)設(shè)計(jì)模式(簡單工廠模式、工廠模式、抽象工廠模式)

    使用工廠模式來生產(chǎn)某類對(duì)象(代碼簡化且容易維護(hù),類之間有血緣關(guān)系,可以通過工廠類進(jìn)行生產(chǎn)); 簡單工廠模式(用于創(chuàng)建簡單對(duì)象) 對(duì)于簡單工廠模式,需要的工廠類只有一個(gè); 在工廠類中的公共成員函數(shù)來創(chuàng)建所需對(duì)象; 工廠模式 簡單工廠模式會(huì)違反開放封閉

    2024年02月11日
    瀏覽(27)
  • 【設(shè)計(jì)模式】單例模式、工廠方法模式、抽象工廠模式

    1. 單例模式 (Singleton Pattern): 場景: 在一個(gè)應(yīng)用程序中,需要一個(gè)全局唯一的配置管理器,確保配置信息只有一個(gè)實(shí)例。 2. 工廠方法模式 (Factory Method Pattern): 場景: 創(chuàng)建一組具有相似功能但具體實(shí)現(xiàn)不同的日志記錄器。 3. 抽象工廠模式 (Abstract Factory Pattern): 場景: 創(chuàng)建不同

    2024年01月15日
    瀏覽(29)
  • 設(shè)計(jì)模式-抽象工廠模式

    抽象工廠模式:該模式是對(duì)工廠模式的拓展,因?yàn)楣S模式中創(chuàng)建的產(chǎn)品都需要繼承自同一個(gè)父類或接口,創(chuàng)建的產(chǎn)品類型相同,無法創(chuàng)建其他類型產(chǎn)品,所以抽象工廠模式對(duì)其進(jìn)行拓展,使其可以創(chuàng)建其他類型的產(chǎn)品。 手機(jī)產(chǎn)品 Pad產(chǎn)品 工廠 優(yōu)點(diǎn):創(chuàng)建的產(chǎn)品種類不單一

    2024年02月13日
    瀏覽(22)
  • 【設(shè)計(jì)模式】抽象工廠模式

    【設(shè)計(jì)模式】抽象工廠模式

    抽象工廠模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠。該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)

    2024年02月13日
    瀏覽(28)
  • 設(shè)計(jì)模式 - 抽象工廠模式

    設(shè)計(jì)模式 - 抽象工廠模式

    學(xué)完工廠模式,才發(fā)現(xiàn)還有一個(gè)抽象工廠模式;學(xué)習(xí)后發(fā)現(xiàn)不論是通過接口方式、還是繼承方式,都可以使用抽象工廠模式;但是個(gè)人建議更多的時(shí)候,我們可以優(yōu)先考慮接口方式,畢竟 單繼承,多實(shí)現(xiàn) 設(shè)計(jì)模式分為三種類型,共23種 創(chuàng)建型模式:單例模式、工廠模式、抽

    2024年02月13日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包