设计模式之十一、抽象工厂模式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++来实现我还真不清楚。
另一种方式,也可以用反射+配置文件的方式来实现,这种用法在我们项目中也经常使用。特别是配合各种数据库信息、服务器信息、端口信息之类的都是在配置文件中进行配置的。
以上。
总结以上是内存溢出为你收集整理的设计模式之(十一、抽象工厂模式Abstract Factory)全部内容,希望文章能够帮你解决设计模式之(十一、抽象工厂模式Abstract Factory)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)