1. 工厂模式定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使得一个类的实例化延迟(目的:解耦 手段:虚函数)到子类。
补充:编译时依赖和运行时依赖
编译依赖:
export LIBRARY_PATH=${HOME}/local/lib:$LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/share/pkgconfig:${HOME}/local/lib/pkgconfig
运行库依赖:
export LD_LIBRARY_PATH=${HOME}/local/lib
2. 工厂模式结构图
3. 使用前提
我们在代码中经常使用到new来实例化一个对象,但是new一个具体的类在某些场景下违背了依赖倒转原则,抽象不依赖于细节,细节依赖于抽象,所以在代码设计的时候才考虑到用工厂模式来解耦。
4. 代码
//抽象基类(手机)
class Phone
{
public:
virtual void Video() = 0;
virtual ~Phone() {}
};
//工厂基类(创建手机)
class CreatePhone
{
public:
virtual Phone* CreatePhoneFactory() = 0; //析构函数实现运行时依赖
virtual ~CreatePhone() {} //虚析构函数
};
//具体类A
class PhoneA : public Phone
{
public:
virtual void Video()
{
cout << "PhoneA" << endl;
}
};
//具体类B
class PhoneB : public Phone
{
public:
virtual void Video()
{
cout << "PhoneB" << endl;
}
};
//工厂类A
class CreatePhoneFactoryA : public CreatePhone
{
public:
virtual Phone* CreatePhoneFactory()
{
return new PhoneA();
}
};
//工厂类B
class CreatePhoneFactoryB : public CreatePhone
{
public:
virtual Phone* CreatePhoneFactory()
{
return new PhoneB();
}
};
//具体调用实现类
class Impl
{
public:
//外部传入具体类 本类中已不依赖于具体类
Impl(CreatePhone* factory)
{
m_factory = factory;
}
void Method()
{
Phone* phone = m_factory->CreatePhoneFactory(); //多态new 将变化移出本类
//手机打开视频
phone->Video();
}
private:
CreatePhone* m_factory = nullptr;
};
5. 总结:
1. Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
2. Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(非更改)的策略。
3. Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。