Skip to content

工厂模式 #13

@wangzitiansky

Description

@wangzitiansky

工厂模式

动机

  • 在软件系统中,经常面临着创建对象的工作,由于需求变化,需要创建的对象的具体类型经常变化
  • 如何绕过常规的 new 方法,提供一种封装机制来避免客户程序和具体对象创建工作的紧耦合

代码示例

有一个文件分割器类和一个 Form 类,Form 类中需要新建一个文件分割器的对象

// 文件分割器基类
class ISplitter{
public:
    virtual void split()=0;
    virtual ~ISplitter(){}
};

// 具体的文件分割器类
class BinarySplitter : public ISplitter{
    
};

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

public:
	void Button1_Click(){
        // 紧密耦合
        // 面向接口编程 变量声明为抽象基类
		ISplitter * splitter=
            new BinarySplitter();//依赖具体类 不好
        
        splitter->split();

	}
};

采用工厂模式的代码

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


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

//具体类
class BinarySplitter : public ISplitter{
    
};

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


class MainForm : public Form
{
    // 工厂类的抽象类的引用
    SplitterFactory*  factory;//工厂

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

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

	}
};

这里新建对象的时候,运行时究竟调用了哪个工厂方法新建了哪个对象,是由 MainFormSplitterFactory 的类型决定的,是一种多态的思想。而且对于 MainForm 来说,并不知道具体的工厂类,是面向接口编程,是一种抽象的思想。

参考

https://www.bilibili.com/video/BV1kW411P7KS?from=search&seid=13066287095511349570

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions