工厂模式

工厂方法模式

先看一下最原始的程序伪代码:

MainForm1.cpp:

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

public:
    void Button1_Click()
    {
        string filePath = txtFilePath->getText();
        int number = atoi(txtFileNumber->getText().c_str());

        FileSplitter* splitter = new FileSplitter(filePath,number);

        splitter->split();
    }
};

Splitter1.cpp:

class FileSplitter
{
public:
    void split()
    {
        //.....

    }
};

当有需求了:

MainForm2.cpp:

class MainForm :public Form{

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

    void Button1_Click()
    {
        ISplitter* splitter = factoryy.CreateSplitter;//依赖具体类

        splitter->split();
    }
};

Splitter2.cpp:

//具体类
class BinarySplitter : public ISplitter
{

};

class TxtSplitter : public ISplitter
{

};

class PictureSplitter : public ISplitter
{

};

class VideoSplitter : public ISplitter
{

};

//具体工厂
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();
    }
};

SplitterFactory.cpp:

//工厂基类
class SplitterFactory{
public:
    virtual ISplitter* CreateSplitter() = 0;
    virtual ~SplitterFactory();
};


//抽象基类
class ISplitter{
public:
    virtual void split() = 0;
    virtual ~ISplitter();
};

工厂模式的应用前景:

1.工厂模式的目的是为了实现解耦,将对象的创建和使用分开,即应用程序将对象的创建和初始化职责交给工厂对象。若一个对象A想要调用对象B时,如果直接通过new关键字来创建一个B实例,然后调用B实例,这样做的不好处是,当需求变更,要将B实例换成C实例时,则需要修改所有new了该实例的方法。

2.降低代码重复。如果对象B的创建过程比较复杂,并且很多地方都用到了,那么很可能出现很多重复的代码,通过统一将创建对象B的代码放到工厂里面统一管理,可以减少代码的重复率,同时也方便维护。相比于构造函数来说,复杂的初始化,会使得构造函数非常的复杂。

由于创建过程都由工厂统一的管理,有利于当业务发生变化之后的修改

3.工厂模式将创建和使用分离,使用者不需要知道具体的创建过程,只需要使用即可。

4.类本身有很多子类,并且经常性发生变化。

总体概括:

创建对象需要大量重复的代码。

创建对象需要访问某些信息,而这些信息不应该包含在复合类中。

创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/11061305.html