设计模式之十一、抽象工厂模式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++来实现我还真不清楚。 另一种方式,也可以用反射+配置文件的方式来实现,这种用法在我们项目中也经常使用。特别是配合各种数据库信息、服务器信息、端口信息之类的都是在配置文件中进行配置的。
以上。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|