工場モデルのシンプルな「デザインモード」(C ++)

序文

モード紹介

クローズドの原則 - シンプルなファクトリパターンの前に、我々は欠陥がオープンに反して、単純なファクトリパターンをご紹介します。あなたが博物館の顔にローストナマコを追加した場合、それはウェイターファクトリクラスを変更します。クローズドタイプの原則に反して。

また、ラーメン店に、例えば、今、このウェイターは、終了パートタイムのウェイターを置き換えるために、彼女の必要性の後ろに顔を売るが、シェフがストーブを離れることができない場合は、それを販売するウェイターと表面の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
面是我炒得,我的名字叫海参!!!
我是海参炒面,里面没有海参哦!!吃的时候注意!

終了

シンプルな工場を解決するためのパターン工場がオープン違反 - 原理を閉じました。疲れた構造が複雑になるが、しかし、拡張のために大幅に改善されました。

おすすめ

転載: www.cnblogs.com/freeman2012/p/11206166.html