序文
モード紹介
クローズドの原則 - シンプルなファクトリパターンの前に、我々は欠陥がオープンに反して、単純なファクトリパターンをご紹介します。あなたが博物館の顔にローストナマコを追加した場合、それはウェイターファクトリクラスを変更します。クローズドタイプの原則に反して。
また、ラーメン店に、例えば、今、このウェイターは、終了パートタイムのウェイターを置き換えるために、彼女の必要性の後ろに顔を売るが、シェフがストーブを離れることができない場合は、それを販売するウェイターと表面の2種類が、それがモデルに変換されますスタイルウィンドウのラインアップ、ナマコ麺のチームは、他のチームのホースラディッシュスープ。各ウィンドウは、シェフが食事を入れている、キュウリの麺がどうなる海は、別のホースラディッシュスープを行います。焼きナマコを行うにあれば上司は、このモードは非常に良好であることを感じて、あなたはそれが焼きナマコを販売しますので、ウェイターが、再学習する必要はありません、焼きナマコのようなウィンドウを開く必要があります。これは、工場出荷時のモードに変わりました。
UMLのクラス図
これは、食べ物を買うためにキューイング私のクライアントには2つの種類を①、必要とします。②シェフの料理教室は、ファクトリクラスは私のために食料を生産します。③料理クラス、クラス生成料理。特定の関係UMLのクラス図は次のとおりです。
コード例
ここでは、ファクトリクラスのために使用されている麺カテゴリーで、あなたは彼の拡張麺カテゴリを継承することができます。
#ifndef NOODLE_H
#define NOODLE_H
class noodle
{
public:
noodle() {}
~noodle() {}
virtual void eating() = 0;
};
#endif // NOODLE_H
以下は、ナマコの麺クラスで、キュウリの麺を食べに実現方法を食べて、麺を継承しました。
#ifndef HAISHENNOODLE_H
#define HAISHENNOODLE_H
#include "noodle.h"
class haishennoodle : public noodle
{
public:
haishennoodle();
~haishennoodle();
virtual void eating();
};
#endif // HAISHENNOODLE_H
#include <iostream>
#include "haishennoodle.h"
haishennoodle::haishennoodle()
{
}
haishennoodle::~haishennoodle()
{
}
void haishennoodle::eating()
{
std::cout << "我是海参炒面,里面没有海参哦!!吃的时候注意!" << std::endl;
}
ここでは、西洋ワサビスープ、麺継承され、実現方法を食べて、スパイシーな根のスープは、次のとおりです。
#ifndef LAGENNOODLE_H
#define LAGENNOODLE_H
#include "noodle.h"
class lagennoodle : public noodle
{
public:
lagennoodle();
~lagennoodle();
virtual void eating();
};
#endif // LAGENNOODLE_H
#include <iostream>
#include "lagennoodle.h"
lagennoodle::lagennoodle()
{
}
lagennoodle::~lagennoodle()
{
}
void lagennoodle::eating()
{
std::cout << "我是辣根汤面,吃完呛的哼啊!!!" << std::endl;
}
以下は、基本クラスファクトリウェイターです。すべての植物は、このクラスを継承しています:
#ifndef WAITER_H
#define WAITER_H
class noodle;
class waiter
{
public:
waiter() {}
~waiter() {}
virtual noodle *createnoodle() = 0;
};
#endif // WAITER_H
次は、ナマコのシェフ(プラント1)で、ナマコナマコの麺はちょうど、createnoodleメソッドを書き換えます料理します
#ifndef HAISHEN_H
#define HAISHEN_H
#include "waiter.h"
class noodle;
class haishen : public waiter
{
public:
haishen();
~haishen();
virtual noodle *createnoodle();
};
#endif // HAISHEN_H
#include <iostream>
#include "haishen.h"
#include "haishennoodle.h"
haishen::haishen()
{
}
haishen::~haishen()
{
}
noodle *haishen::createnoodle()
{
std::cout << "面是我炒得,我的名字叫海参!!!" << std::endl;
return new haishennoodle();
}
ここでは、西洋ワサビシェフ(プラント1)、ホースラディッシュホースラディッシュスープ料理は、ちょうど、createnoodleメソッドを書き換えますされています。
#ifndef LAGEN_H
#define LAGEN_H
#include "waiter.h"
class lagen : public waiter
{
public:
lagen();
~lagen();
virtual noodle *createnoodle();
};
#endif // LAGEN_H
#include <iostream>
#include "lagen.h"
#include "lagennoodle.h"
lagen::lagen()
{
}
lagen::~lagen()
{
}
noodle *lagen::createnoodle()
{
std::cout << "吃辣根汤面,你不觉得呛得哼吗??" << std::endl;
return new lagennoodle();
}
以下は、クライアント、適切なインスタンスを確立するために、対応するクラスファクトリを使用して、クライアントのカテゴリであります:
#include <iostream>
#include <string.h>
#include "haishen.h"
#include "lagen.h"
#include "noodle.h"
using namespace std;
char *product_list[] = {
"haishen-noodle",
"lagen-noodle",
NULL
};
int main()
{
char *p = NULL;
char *pd = "haishen-noodle";
int i = 0;
waiter *w = NULL;
noodle *n = NULL;
for(p = product_list[i]; p != NULL; i++, p = product_list[i]) {
if(strncmp(pd, p, strlen(pd)) == 0) {
if(i == 0) {
w = new haishen();
} else if(i == 1) {
w = new lagen();
} else {
cout << "对不起,请您排在队内!!!" << std::endl;
break;
}
}
}
if(w) n = w->createnoodle();
if(n) n->eating();
if(w) {
delete w; w = NULL;
}
if(n) {
delete n; n = NULL;
}
return 0;
}
ここでは、Makefileを生成する手助けCMakeList.txtファイルは以下のとおりです。
cmake_minimum_required(VERSION 2.8)
project(noodle-factory)
set(SRC_LIST main.cpp noodle.h waiter.h haishen.h haishen.cpp haishennoodle.h haishennoodle.cpp
lagennoodle.h lagennoodle.cpp lagen.h lagen.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})
コンパイルと実行結果
ダウンロードリンクは次のとおりです。https://github.com/erguangqiang/freesir_headfirst/blob/master/noodle-factory.tar.gz
使用cmakeのはMakefileを生成し、実行可能プログラムの麺をコンパイルします。結果は以下の通りであります:
erguangqiang@elab$./noodle-factory
面是我炒得,我的名字叫海参!!!
我是海参炒面,里面没有海参哦!!吃的时候注意!
終了
シンプルな工場を解決するためのパターン工場がオープン違反 - 原理を閉じました。疲れた構造が複雑になるが、しかし、拡張のために大幅に改善されました。