程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式之工場形式

C++設計形式之工場形式

編輯:關於C++

C++設計形式之工場形式。本站提示廣大學習愛好者:(C++設計形式之工場形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式之工場形式正文


由碰到的成績引收工廠形式

在面向對象體系設計中常常可以碰到以下的兩類成績:

◆ 1.為了進步內聚(Cohesion)和松耦合(Coupling),我們常常會籠統出一些類的公共接口以構成籠統基類或許接口。如許我們可以經由過程聲明一個指向基類的指針來指向現實的子類完成,到達了多態的目標。這裡很輕易湧現的一個成績 n 多的子類繼續自籠統基類,我們不能不在每主要用到子類的處所就編寫諸如 new ×××;的代碼。這裡帶來兩個成績:
客戶法式員必需曉得現實子類的稱號(當體系龐雜後,定名將是一個很欠好處置的成績,為了處置能夠的名字抵觸,有的定名能夠其實不是具有很好的可讀性和可記憶性,就權且豈論分歧法式員光怪陸離的小我偏好了)。
法式的擴大性和保護變得愈來愈艱苦。

◆ 2.還有一種情形就是在父類中其實不曉得詳細要實例化哪個詳細的子類。這裡的意思為:假定我們在類 A 中要應用到類 B,B 是一個籠統父類,在 A 中其實不曉得詳細要實例化那一個 B 的子類,然則在類 A 的子類 D 中是可以曉得的。在 A 中我們沒有方法直接應用相似於 new ×××的語句,由於基本就不曉得×××是甚麼。

以上兩個成績也就引出了工場形式的兩個最主要的功效:

  1. 界說創立對象的接口,封裝了對象的創立;
  2. 使得詳細化類的任務延遲到了子類中。
  3. 形式選擇

    我們平日應用工場形式來處理下面給出的兩個成績。在第一個成績中,我們常常就是聲明一個創立對象的接口,並封裝了對象的創立進程。工場這裡相似於一個真正意義上的工場(臨盆對象)。在第二個成績中,我們須要供給一個對象創立對象的接口,並在子類中供給其詳細完成(由於只要在子類中可以決議究竟實例化哪個類)。

    第一中情形的工場的構造表示圖為:

    圖 1 所以的工場形式常常在體系開辟頂用到,然則這其實不是工場形式的最年夜威力地點(由於這可以經由過程其他方法處理這個成績)。工場形式不單是供給了創立對象的接口,其最主要的是延遲了子類的實例化(第二個成績),以下是這類情形的一個工場的構造表示圖:

    圖 2 中症結中工場形式的運用其實不是只是為了封裝對象的創立,而是要把對象的創立放到子類中完成:工場中只是供給了對象創立的接口,其完成將放在工場的子類Concrete工場中停止。這是圖 2 和圖 1 的差別地點。

    工場形式的完成

    完全代碼示例(code):工場形式的完成比擬簡略,這裡為了便利初學者的進修和參考,將給出完全的完成代碼(一切代碼采取 C++完成,並在 VC 6.0 下測試運轉)。

    代碼片段 1:Product.h

    //Product.h
    #ifndef _PRODUCT_H_
    #define _PRODUCT_H_
    class Product{
     public:
     virtual ~Product() =0;
     protected:
     Product(); //屏障結構函數
     private:
    };
    class ConcreteProduct:publicProduct{
     public:
     ~ConcreteProduct();
     ConcreteProduct();
     protected:
     private:
    };
    #endif //~_PRODUCT_H_

    代碼片段 2:Product.cpp

    //Product.cpp
    #include "Product.h"
    #include<iostream>
    using namespace std;
    Product::Product(){
    }
    Product::~Product(){
    }
    ConcreteProduct::ConcreteProduct(){
     cout<<"ConcreteProduct...."<<endl;
    }
    ConcreteProduct::~ConcreteProduct(){
    }
    

    代碼片段 3:Factory.h

    //Factory.h
    #ifndef _FACTORY_H_
    #define _FACTORY_H_
    class Product;
    class Factory{
     public:
     virtual ~Factory() = 0;
     virtual Product* CreateProduct() = 0;
     protected:
     Factory();
     private:
    };
    class ConcreteFactory:public Factory{
     public:
     ~ConcreteFactory();
     ConcreteFactory();
     Product* CreateProduct();
     protected:
     private:
    };
    #endif //~_FACTORY_H_
    

    代碼片段 4:Factory.cpp

    //Factory.cpp
    #include "Factory.h"
    #include "Product.h"
    #include <iostream>
    using namespace std;
    Factory::Factory(){
    }
    Factory::~Factory(){
    }
    ConcreteFactory::ConcreteFactory(){
     cout<<"ConcreteFactory....."<<endl;
    }
    ConcreteFactory::~ConcreteFactory(){
    }
    Product* ConcreteFactory::CreateProduct(){
     return new ConcreteProduct();
    }
    

    代碼片段 5:main.cpp

    //main.cpp
    #include "Factory.h"
    #include "Product.h"
    #include <iostream>
    using namespace std;
    int main(int argc,char* argv[]){
     Factory* fac = new ConcreteFactory();
     Product* p = fac->CreateProduct();
     return 0;
    }
    

    代碼解釋:示例代碼中給出的是工場形式處理父類中其實不曉得詳細要實例化哪個詳細的子類的成績,至於為創立對象供給接口成績,可以由工場中附加響應的創立操作例如Create***Product()便可。詳細請加入評論辯論內容。

    關於工場形式的評論辯論

    工場形式在現實開辟中運用異常普遍,面向對象的體系常常面對著對象創立成績:要創立的類其實是太多了。而工場供給的創立對象的接口封裝(第一個功效),和其將類的實例化推延到子類(第二個功效)都部門地處理了現實成績。一個簡略的例子就是筆者開開辟 VisualCMCS 體系的語義剖析進程中,因為要為文法中的每一個非終結符結構一個類處置,是以這個進程中對象的創立異常多,采取工場形式後體系可讀性性和保護都變得elegant 很多。

    工場形式也帶來至多以下兩個成績:

    1. 假如為每個詳細的 ConcreteProduct 類的實例化供給一個函數體,那末我們能夠不能不在體系中添加了一個辦法來處置這個新建的 ConcreteProduct,如許工場的接口永久就不願能關閉(Close)。固然我們可以經由過程創立一個工場的子類來經由過程多態完成這一點,然則這也是以新建一個類作為價值的。
    2. 在完成中我們可以經由過程參數化工場辦法,即給 工場Method()傳遞一個參數用以決議是創立詳細哪個詳細的 Product(現實上筆者在 VisualCMCS 中也恰是如許做的)。固然也能夠經由過程模板化防止 1)中的子類創立子類,其辦法就是將詳細 Product 類作為模板參數,完成起來也很簡略。
    3. 可以看出,工場形式關於對象的創立賜與開辟人員供給了很好的完成戰略,然則工場形式僅僅局限於一類類(就是說 Product 是一類,有一個配合的基類),假如我們要為分歧類的類供給一個對象創立的接口,那就要用 Abstract工場了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved