C ++の設計パターン - ファクトリメソッドパターン

モード「オブジェクトの作成」
作成した安定したオブジェクトをサポートするために、密結合オブジェクトの作成(新しい)プロセス結果(従属具象クラス)を避けるために、新しい「オブジェクトの作成」モードによってバイパスを。これは、インターフェイスの抽象化後の最初のステップです。
動機
需要の変化に起因する、特定のオブジェクトの種類が多いの変化を作成する必要があります。多くの場合、オブジェクトの仕事の創出に直面したソフトウェアシステム、インチ

この変化に対応するには?密結合クライアントと、この「特定のオブジェクトの作成作業を」避けるために「パッケージのメカニズム」を提供するために、従来のオブジェクトをバイパスする方法(新しい)を作成する方法?
スキーマ定義は、
オブジェクトを作成するためのインタフェースを定義しますが、サブクラスがインスタンス化技術にどのクラスを決定しましょう。ファクトリメソッドリターダようなクラスのインスタンス(オブジェクトの仮想関数:手段デカップリング)そのサブクラスです。
- 「デザインパターン」のGoFの
構成
QQ画像20200119233514.png
例は
、我々は、ファイルスプリッタを設計したと

class ISplitter{//Product抽象类
public:
    virtual void split()=0;
    virtual ~ISplitter(){}
};
//以下具体的Product类
class BinarySplitter : public ISplitter{
    
};

class TxtSplitter: public ISplitter{
    
};

class PictureSplitter: public ISplitter{
    
};

class VideoSplitter: public ISplitter{
    
};
class MainForm : public Form
{
    TextBox* txtFilePath;
    TextBox* txtFileNumber;
    ProgressBar* progressBar;

public:
    void Button1_Click(){


        
        ISplitter * splitter=
            new BinarySplitter();//依赖具体类
        
        splitter->split();

    }
};

依存コンパイル時でのMainFormの上に新しい具象クラスでは、によってBinarySplitterをコンパイルする必要がある
、我々は、以下の改善を行うオブジェクト指向のアプローチを使用しては、

//工厂基类
class SplitterFactory{
public:
    virtual ISplitter* CreateSplitter()=0;
    virtual ~SplitterFactory(){}
};
//具体工厂
class BinarySplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new BinarySplitter();
    }
};

class TxtSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new TxtSplitter();
    }
};

class PictureSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new PictureSplitter();
    }
};

class VideoSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new VideoSplitter();
    }
};

class MainForm : public Form
{
    SplitterFactory*  factory;//工厂

public:
    
    MainForm(SplitterFactory*  factory){
        this->factory=factory;
    }
    
    void Button1_Click(){

        
        ISplitter * splitter=
            factory->CreateSplitter(); //多态new
        
        splitter->split();

    }
};

したがって、唯一のMainForm ISplitter SplitterFactoryと2つの抽象クラスではなく、特定のクラスに依存して頼る
要約
ユーザと分離クラスオブジェクトの特定のタイプとの間のモード結合のため1.Factory法。絶えず変化の特定のタイプの顔、密結合(新)は、脆弱なソフトウェアにつながります。
オブジェクト指向のアプローチを介して2.Factory Methodパターン、ポリシー拡張(ただし変化する)、この密結合関係に優れたソリューションを実現するために、遅延のサブクラスを作成することを目的とされる特定の仕事。
「単一のオブジェクト」を解決するために3.Factory Methodモードは、変更を必要とします。彼らは作成方法/同じパラメータを必要とするという欠点。

おすすめ

転載: www.cnblogs.com/Redwarx008/p/12216080.html