设计模式之(十一、抽象工厂模式Abstract Factory)

来源:互联网 发布:日军 知乎 编辑:程序博客网 时间:2024/05/21 00:44

设计模式之十一、抽象工厂模式Abstract Factory
适用范围:
与之前学过的工厂方法模式类似,当涉及到多个产品系列的问题时,就成为了抽象工厂模式。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
书中的实例:
当涉及到使用到的各种数据库时,比如说,SqlServer、Oracle、MySql等等,可以简单地实现各个数据库间的切换。
抽象工厂模式的结构图如下:
C++关键代码实现如下:
1、工厂接口类IFactory.h
virtual IProductA* CreateProductA() = 0;
virtual IProductB* CreateProductB() = 0;

2、两个产品的接口类IProductA. IProductB。
3、具体的工厂实现类CConcreteFactoryA1.cpp
实现父接口IFactory
IProductA *CConcreteFactoryA::CreateProductA()
{
   return (IProductA*)new CConcreteProductA1();
}

IProductB *CConcreteFactoryA::CreateProductB()
{
   return (IProductB*)new CConcreateProductB1();
}
4、具体的工厂实现类CConcreteFactoryB.cpp
实现父接口IFactory。
IProductA *CConcreteFactoryB::CreateProductA()
{
   return (IProductA*)new CConcreteProductA2();
}

IProductB *CConcreteFactoryB::CreateProductB()
{
   return (IProductB*)new CConcreateProductB2();
}

5、具体的产品类的实现CConcreteProductA1.cpp
在构造函数中打印出提示信息.
CConcreteProductA1::CConcreteProductA1()
{
   cout<<"初始化产品A1..."<<endl;
}
其它具体产品类与此类似,在此不累述.

6、客户端代码main.cpp
IFactory *f = new CConcreteFactoryA();
IProductA *p1 = f->CreateProductA();
IProductB *p2 = f->CreateProductB();

IFactory *f2 = new CConcreteFactoryB();
IProductA *p3 = f2->CreateProductA();
IProductB *p4 =  f2->CreateProductB();

if(p1 != NULL)
{
   delete p1;
}

if(p2 != NULL)
{
   delete p2;
}

if(p3 != NULL)
{
   delete p3;
}

if(p4 != NULL)
{
   delete p4;
}


if(f != NULL)
{
  delete f;
}

if(f2 != NULL)
{
   delete f2;
}

其实可以看出,它的实现与我们之前学过的工厂方法模式没有太大出入,只是调用的对象多了而已。
在此其实也可以简化各个接口类,可以和简单工厂模式结合使用,通过switch语句来判断,到底需要实例化哪个子对象。
另外,还可以通过反射+抽象工厂的方式来实现,我看到了C#代码的实现,但是具体应该如何用C++来实现我还真不清楚。
另一种方式,也可以用反射+配置文件的方式来实现,这种用法在我们项目中也经常使用。特别是配合各种数据库信息、服务器信息、端口信息之类的都是在配置文件中进行配置的。

以上。

原创粉丝点击