工厂模式: 对简单工厂模式的进一步抽象和推广,保持了简单工厂模式的优点,而且克服了简单工厂模式的缺点,可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
意图: 把对象实例化的动作提取出来,和主项目的过程或者方法的依赖关系进行解耦,通过这种方式来使整个项目、工程能够有更好的扩展性和维护性。工厂模式就是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
主要解决: 构造工厂对象,将构造的工作交给工厂。在工厂对象里针对具体实现new。换句话说,并不是解决垃圾而是将垃圾收集起来。
何时使用: 我们明确地计划不同条件下创建不同实例时。
如何解决: 让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码: 抽象工厂、具体工厂、抽象产品和具体产品的实现。
优点:
1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2.灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
3.典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点:
1.类的个数容易过多,增加复杂度
2.增加了系统的抽象性和理解难度
3.抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
#include <iostream>
using namespace std;
//抽象产品角色:它是具体产品继承的父类或者是实现的接口。
class AbstractProduct
{
public:
virtual void Show()
{
cout<<"抽象产品"<<endl;
}
};
//具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
class ConcreateProductA:public AbstractProduct
{
public:
virtual void Show()
{
cout<<"生产产品A......"<<endl;
}
};
//具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
class ConcreateProductB:public AbstractProduct
{
public:
virtual void Show()
{
cout<<"生产产品B......"<<endl;
}
};
//抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
class AbstractFactory
{
public:
virtual AbstractProduct* CreateProduct()=0;
};
//具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
class FactoryA:public AbstractFactory
{
public:
virtual AbstractProduct* CreateProduct()
{
cout<<"具体工厂A生成-->具体产品A"<<endl;
return new ConcreateProductA();
}
};
//具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
class FactoryB:public AbstractFactory
{
public:
virtual AbstractProduct* CreateProduct()
{
cout<<"具体工厂B生成-->具体产品B"<<endl;
return new ConcreateProductB();
}
};
int main()
{
AbstractFactory* factory = new FactoryA();
AbstractProduct* product = factory->CreateProduct();
product->Show();
system("pause");
return 0;
}