动机
- 在软件系统中,经常面临着创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化
定义
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类
要点
- 工厂方法模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合(new)会导致软件的脆弱
- 工厂方法通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系
- 工厂方法模式解决单个对象的需求变化,缺点在于要求创建方法参数相同
示例
#include <cstdio>
//业务类的基类
class CBase
{
public:
virtual ~CBase(){}
virtual void Print() = 0;
};
//具体业务类0
class CChild0 : public CBase
{
public:
virtual void Print() { printf("Type0\n"); }
};
//具体业务类1
class CChild1 : public CBase
{
public:
virtual void Print() { printf("Type1\n"); }
};
//工厂基类
class CFactory
{
public:
virtual ~CFactory() {}
virtual CBase* Create() = 0;
};
//具体业务类0对应的工厂
class CFactoryType_0 : public CFactory
{
public:
CBase* Create() { return new CChild0; }
};
//具体业务类1对应的工厂
class CFactoryType_1 : public CFactory
{
public:
CBase* Create() { return new CChild1; }
};
//业务处理类
class CMakeCar
{
public:
CMakeCar() : pFactory_(nullptr) {}
void SetFactory(CFactory* pFactory) { this->pFactory_ = pFactory; }
void Deal()
{
//工厂的核心就是对此处进行解耦
auto p = pFactory_->Create();
p->Print();
delete p; //随意写的delete
}
private:
CFactory* pFactory_;
};
int main()
{
CFactoryType_0 FactoryChild0;
CFactoryType_1 FactoryChild1;
CMakeCar MakeCar;
MakeCar.SetFactory(&FactoryChild0);
MakeCar.Deal(); //输出Type0
MakeCar.SetFactory(&FactoryChild1);
MakeCar.Deal(); //输出Type1
return 0;
}
https://www.bilibili.com/video/av24176315/?p=8
网友评论