2016-10-15 5 views
1

このコードがすべてのことをしているのではないかと疑問に思っていた純粋なファクトリメソッドデザインパターンは尋ねていますか?これは私の最終的なプログラミングモジュールの準備であり、それが設計パターンの正しい適用であることを確認するだけです。ファクトリメソッドC++の実装

#include <QCoreApplication> 
#include <QString> 
#include <QDebug> 

class Bread 
{ 
public: 
    virtual void print() = 0; 
}; 

class WhiteBread: public Bread 
{ 
public: 
    void print() { 
     qDebug() << "White bread"; 
    } 
}; 

class BrownBread: public Bread 
{ 
public: 
    void print() { 
     qDebug() << "Brown bread"; 
    } 
}; 

class BreadFactory { 
public: 
    Bread* makeBread(QString type) { 
     if (type == "White bread") 
      return new WhiteBread(); 
     else if (type == "Brown bread") 
      return new BrownBread(); 
    } 
}; 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    BreadFactory *breadFactory = new BreadFactory(); 
    Bread *breadType; 

    breadType= breadFactory->makeBread("White bread"); 
    breadType->print(); 

    breadType = breadFactory->makeBread("Brown bread"); 
    breadType->print(); 

    return a.exec(); 
} 
+1

私はこれを '抽象ファクトリメソッド' と呼ばれていると思います。それが意味するものなら、それはOKです。しかし、本当に「純粋な」(純粋仮想)が意味されている場合は、純粋な仮想(ボディなし)のファクトリメソッドと、同じシグネチャを持つそのメソッドの実装を持つ2つの継承している具象クラスを持つ抽象祖先クラス(abstractファクトリメソッドの抽象戻り型の異なる派生クラスのオブジェクトを作成します。 –

+0

あなたのものはファクトリメソッドの単純化されたバリエーションであり、実用的ではありません。ファクトリクラスコードを変更せずに新しい派生オブジェクトyellow_breadをインクルードする必要がある場合オブジェクトを動的に登録できるメソッドが工場で必要です。 – seccpur

+0

btw、仮想デストラクタがありません。makeBreadのすべてのパスが返されるわけではありません。 'unique_ptr'は生ポインタよりも優れています。 – Jarod42

答えて

2
  1. あなたは、インスタンスBreadFactoryを行う必要はありません。ちょうど静的メソッドを使用します。

    class BreadFactory 
    { 
        public: 
         static Bread* makeBread(QString type) 
         { 
         ... 
         } 
    }; 
    
    //in main 
    Bread *breadType = BreadFactory::makeBread("White Bread"); 
    breadType->print(); 
    
  2. 明確にするため++ 11 overrideキーワードC使用。

    class WhiteBread : public Bread 
    { 
    public: 
        void print() override{ 
    ... 
    
  3. スマートポインタ間++ 11 unique_ptr Cを使用します。

    static unique_ptr<Bread> makeBread(QString type) { 
        if (type == "White bread") 
         return std::make_unique<WhiteBread>(); 
        else if (type == "Brown bread") 
         return std::make_unique<BrownBread>(); 
        else 
         return nullptr; 
    } 
    
  4. virtualデストラクタを使用してください。

    class Bread 
    { 
    public: 
        virtual void print() = 0; 
        virtual ~Bread() {}; 
    }; 
    
0

Aファクトリメソッドの実装は次のようになります:

class BreadMaker 
{ 
public: 
    virtual Bread* makeBread() = 0; 
} 

class WhiteBreadMaker : public BreadMaker 
{ 
public: 
    Bread* makeBread(); 
} 

// WhiteBreadMaker.cpp 
Bread* WhiteBreadMaker::makeBread() 
{ 
    return new WhiteBread(); 
} 

// ***Similarly for BrownBreadMaker 

// main.cpp 
int main() 
{ 
    BreadMaker *maker = new WhiteBreadMaker(); // or BrownBreadMaker 

    Bread *bread = maker->makeBread(); 
    bread->print(); // prints "White Bread" or "Brown Bread" depending on the Factory class used. 
}