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 두 개의 추상 클래스에 의존, 특정 클래스에 의존하기보다는
요약
사용자와 절연 클래스 객체의 특정 유형 사이의 결합 모드 1.Factory 방법. 단단히 (신규) 결합 끊임없이 변화하는 특정 유형의 얼굴, 깨지기 쉬운 소프트웨어로 이어질 것입니다.
객체 지향 접근 방식을 통해 2.Factory 메소드 패턴은 특정 작업 내선 (하지만 변화)이 밀 결합 관계에 더 나은 솔루션을 정책을 달성하기 위해, 지연의 서브 클래스를 생성하는 것을 목적으로한다.
3.Factory 방법 모드는 "단일 개체가"변경을 필요로 해결합니다. 단점 그들은 생성 방법 / 같은 매개 변수를 필요로하는.

추천

출처www.cnblogs.com/Redwarx008/p/12216080.html