C++デザインモード——工場仕様モード

12993 ワード

本論文の著作権はゼリーは所有で、転載を歓迎しますが、作者の同意なしにこの声明を保留しなければなりません.文章のページの明確な位置に原文のリンクを与えます.そうでなければ、法律責任を追及する権利を保留します.
書式 
本論文のリンク:
http://www.jellythink.com/archives/62
書式 
このサイトを購読:
http://www.jellythink.com/feed
書式 
転載はソースを明記してください.
ゼリーは 書式 
『C++デザインモード——工場方法モード』
問題の説明
以前はC++デザインモード——シンプル工場モードに触れましたが、簡単な工場モデルの制限のため、例えば、工場は今Produca、Product B、Produccの3つの製品を生産できます.まず、製品の列挙の種類に新しい製品の種類の標識を追加して、その後、Factory類のswitch構造コードを修正する必要がありますか?はい、このようなコードの修正は、既存のコードに対する修正運動量が大きく、符号化上のエラーが発生しやすいです.このコードに対する修正は最も原始的で、最も野蛮な修正であり、本質的にはコードに対する拡張とは言えない.同時に、既存の関数を修正しましたので、以前行ったテストは無効になります.すべてのテストはやり直しが必要です.すべてのコードは上書きし直さなければなりません.このように、コストを増やして、効率を高めることができないことは、会社では絶対に許されません.さまざまな理由から、簡単な工場モデルは、実際のプロジェクトで使用するものが少ないです.どうすればいいですか?どうすればいいですか?既存のコードに対する影響を最小限に抑えながら、既存の機能を拡張する必要があります.
UMLクラス図
さて、今日紹介した工場仕様モデルは、厳かに登場しました.簡単な工場モデルの拡張にすぎません.GOFの紹介では、それらは合併しています.私は別々に説明します.つまり、両者の利害を区別するために、実際のプロジェクトの中でより良い把握と応用ができます.工場法モデルは簡単な工場モデルに基づいて、「工場」に抽象層を追加しました.工場共通の動作を抽象化して、抽象的なものとして、具体的な行為は子供類自身で実現して、子供たちにどのような製品を生産するかを決めさせます.
C++设计模式——工厂方法模式_第1张图片
図のように、FactoryAはProductAの生産に専念しています.FactoryBはProduct Bの生産に専念しています.FactoryAとFactoryBは関係ありません.もし後期になると、Product Cを生産する必要があれば、FactoryC工場類を作成して、Producc類の生産に専念します.FactoryA、FactoryBとFactoryCは関係ないので、FactoryCに加入すると、FactoryAとFactoryBの仕事に影響がないので、コードをテストする時は、単独でFactoryCとProductCをユニットテストするだけで、FactoryAとFactoryBはテストをしなくてもいいです.
適用の場合
工場の方法モデルの意味は、製品のオブジェクトを作成する工場インターフェースを定義し、実際の作成作業をサブクラスに延期することです.核心工場類はもう製品の創建に責任を持たないで、このように核心種類は抽象的な工場の役になります.具体的な工場のサブクラスの必ず実現しなければならないインターフェイスだけを担当します.
  • 設計の初期に、製品が後期に拡張されることを考慮して、工場の方法モデルを使用することができます.
  • 製品の構造が複雑な場合、工場の方法モードを使用することができます.
  • デザインモードを使用するには、詳細な設計において決定が必要であるため、多様な要因を考慮して設計モードを使用することはできない.
    コードの実装
     1 /*
     2 ** FileName     : FactoryMethodPatternDemo
     3 ** Author       : Jelly Young
     4 ** Date         : 2013/11/18
     5 ** Description  : More information, please go to http://www.jellythink.com
     6 */
     7 
     8 #include <iostream>
     9 using namespace std;
    10 
    11 class Product
    12 {
    13 public:
    14     virtual void Show() = 0;
    15 };
    16 
    17 class ProductA : public Product
    18 {
    19 public:
    20     void Show()
    21     {
    22         cout<< "I'm ProductA"<<endl;
    23     }
    24 };
    25 
    26 class ProductB : public Product
    27 {
    28 public:
    29     void Show()
    30     {
    31         cout<< "I'm ProductB"<<endl;
    32     }
    33 };
    34 
    35 class Factory
    36 {
    37 public:
    38     virtual Product *CreateProduct() = 0;
    39 };
    40 
    41 class FactoryA : public Factory
    42 {
    43 public:
    44     Product *CreateProduct()
    45     {
    46         return new ProductA ();
    47     }
    48 };
    49 
    50 class FactoryB : public Factory
    51 {
    52 public:
    53     Product *CreateProduct()
    54     {
    55         return new ProductB ();
    56     }
    57 };
    58 
    59 int main(int argc , char *argv [])
    60 {
    61     Factory *factoryA = new FactoryA ();
    62     Product *productA = factoryA->CreateProduct();
    63     productA->Show();
    64 
    65     Factory *factoryB = new FactoryB ();
    66     Product *productB = factoryB->CreateProduct();
    67     productB->Show();
    68 
    69     if (factoryA != NULL)
    70     {
    71         delete factoryA;
    72         factoryA = NULL;
    73     }
    74 
    75     if (productA != NULL)
    76     {
    77         delete productA;
    78         productA = NULL;
    79     }
    80 
    81     if (factoryB != NULL)
    82     {
    83         delete factoryB;
    84         factoryB = NULL;
    85     }
    86 
    87     if (productB != NULL)
    88     {
    89         delete productB;
    90         productB = NULL;
    91     }
    92     return 0;
    93 }
    2013年11月18日は大連、東軟にあります.