C++デザインモード——工場仕様モード
12993 ワード
本論文の著作権はゼリーは所有で、転載を歓迎しますが、作者の同意なしにこの声明を保留しなければなりません.文章のページの明確な位置に原文のリンクを与えます.そうでなければ、法律責任を追及する権利を保留します.
書式
本論文のリンク:
http://www.jellythink.com/archives/62
書式
このサイトを購読:
http://www.jellythink.com/feed
書式
転載はソースを明記してください.
ゼリーは 書式
『C++デザインモード——工場方法モード』
問題の説明
以前はC++デザインモード——シンプル工場モードに触れましたが、簡単な工場モデルの制限のため、例えば、工場は今Produca、Product B、Produccの3つの製品を生産できます.まず、製品の列挙の種類に新しい製品の種類の標識を追加して、その後、Factory類のswitch構造コードを修正する必要がありますか?はい、このようなコードの修正は、既存のコードに対する修正運動量が大きく、符号化上のエラーが発生しやすいです.このコードに対する修正は最も原始的で、最も野蛮な修正であり、本質的にはコードに対する拡張とは言えない.同時に、既存の関数を修正しましたので、以前行ったテストは無効になります.すべてのテストはやり直しが必要です.すべてのコードは上書きし直さなければなりません.このように、コストを増やして、効率を高めることができないことは、会社では絶対に許されません.さまざまな理由から、簡単な工場モデルは、実際のプロジェクトで使用するものが少ないです.どうすればいいですか?どうすればいいですか?既存のコードに対する影響を最小限に抑えながら、既存の機能を拡張する必要があります.
UMLクラス図
さて、今日紹介した工場仕様モデルは、厳かに登場しました.簡単な工場モデルの拡張にすぎません.GOFの紹介では、それらは合併しています.私は別々に説明します.つまり、両者の利害を区別するために、実際のプロジェクトの中でより良い把握と応用ができます.工場法モデルは簡単な工場モデルに基づいて、「工場」に抽象層を追加しました.工場共通の動作を抽象化して、抽象的なものとして、具体的な行為は子供類自身で実現して、子供たちにどのような製品を生産するかを決めさせます.
図のように、FactoryAはProductAの生産に専念しています.FactoryBはProduct Bの生産に専念しています.FactoryAとFactoryBは関係ありません.もし後期になると、Product Cを生産する必要があれば、FactoryC工場類を作成して、Producc類の生産に専念します.FactoryA、FactoryBとFactoryCは関係ないので、FactoryCに加入すると、FactoryAとFactoryBの仕事に影響がないので、コードをテストする時は、単独でFactoryCとProductCをユニットテストするだけで、FactoryAとFactoryBはテストをしなくてもいいです.
適用の場合
工場の方法モデルの意味は、製品のオブジェクトを作成する工場インターフェースを定義し、実際の作成作業をサブクラスに延期することです.核心工場類はもう製品の創建に責任を持たないで、このように核心種類は抽象的な工場の役になります.具体的な工場のサブクラスの必ず実現しなければならないインターフェイスだけを担当します.設計の初期に、製品が後期に拡張されることを考慮して、工場の方法モデルを使用することができます. 製品の構造が複雑な場合、工場の方法モードを使用することができます. デザインモードを使用するには、詳細な設計において決定が必要であるため、多様な要因を考慮して設計モードを使用することはできない.
コードの実装
書式
本論文のリンク:
http://www.jellythink.com/archives/62
書式
このサイトを購読:
http://www.jellythink.com/feed
書式
転載はソースを明記してください.
ゼリーは 書式
『C++デザインモード——工場方法モード』
問題の説明
以前はC++デザインモード——シンプル工場モードに触れましたが、簡単な工場モデルの制限のため、例えば、工場は今Produca、Product B、Produccの3つの製品を生産できます.まず、製品の列挙の種類に新しい製品の種類の標識を追加して、その後、Factory類のswitch構造コードを修正する必要がありますか?はい、このようなコードの修正は、既存のコードに対する修正運動量が大きく、符号化上のエラーが発生しやすいです.このコードに対する修正は最も原始的で、最も野蛮な修正であり、本質的にはコードに対する拡張とは言えない.同時に、既存の関数を修正しましたので、以前行ったテストは無効になります.すべてのテストはやり直しが必要です.すべてのコードは上書きし直さなければなりません.このように、コストを増やして、効率を高めることができないことは、会社では絶対に許されません.さまざまな理由から、簡単な工場モデルは、実際のプロジェクトで使用するものが少ないです.どうすればいいですか?どうすればいいですか?既存のコードに対する影響を最小限に抑えながら、既存の機能を拡張する必要があります.
UMLクラス図
さて、今日紹介した工場仕様モデルは、厳かに登場しました.簡単な工場モデルの拡張にすぎません.GOFの紹介では、それらは合併しています.私は別々に説明します.つまり、両者の利害を区別するために、実際のプロジェクトの中でより良い把握と応用ができます.工場法モデルは簡単な工場モデルに基づいて、「工場」に抽象層を追加しました.工場共通の動作を抽象化して、抽象的なものとして、具体的な行為は子供類自身で実現して、子供たちにどのような製品を生産するかを決めさせます.
図のように、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日は大連、東軟にあります.