好久没写博客了,前端时间比较忙。
今天开始写创建型模式的demo。第一个模式是抽象工厂,也是圣经上第一个模式。当然也是比较简单的模式,该模式主要职责是将客户和具体的产品分离了。
将多个产品组装到同一个工厂下。客户只需要跟工厂打交道,而不需要知道产品具体的实现方式。
先写个demo,很简单,有一个抽象工厂,可以生产A/B两种产品。有两个具体的工厂,工厂1、2。他们都可以生产A/B两种产品,但是具体制造过程可能不一样。
/**
* @file test_abstract_factory.cpp
* @author itegel
* @date 2013/09/10 19:44:32
* @brief
*
**/
#include <iostream>
using namespace std;
class ItemA{
public:
ItemA(){
cout<<"ItemA created!"<<endl;
}
};
class ItemB{
public:
ItemB(){
cout<<"ItemB created!"<<endl;
}
};
class ItemA1:public ItemA{
public:
ItemA1(){
cout<<"ItemA1 created!"<<endl;
}
};
class ItemA2:public ItemA{
public:
ItemA2(){
cout<<"ItemA2 created!"<<endl;
}
};
class ItemB1:public ItemB{
public:
ItemB1(){
cout<<"ItemB1 created!"<<endl;
}
};
class ItemB2:public ItemB{
public:
ItemB2(){
cout<<"ItemB2 created!"<<endl;
}
};
class AbstractFactory{
public:
AbstractFactory(){}
virtual ItemA * CreateItemA() = 0;
virtual ItemB * CreateItemB() = 0;
private:
//int m_type;
};
class Factory1:public AbstractFactory{
public:
Factory1(){}
ItemA * CreateItemA(){
return new ItemA1();
}
ItemB * CreateItemB(){
return new ItemB1();
}
};
class Factory2:public AbstractFactory{
public:
Factory2(){}
ItemA * CreateItemA(){
return new ItemA2();
}
ItemB * CreateItemB(){
return new ItemB2();
}
};
int main(){
AbstractFactory * factory;
cout<<"factory 1 working...."<<endl;
factory = new Factory1();
factory->CreateItemA();
factory->CreateItemB();
delete factory;
cout<<endl<<"factory 2 working...."<<endl;
factory = new Factory2();
factory->CreateItemA();
factory->CreateItemB();
delete factory;
return 0;
}
输出如下:
factory 1 working....
ItemA created!
ItemA1 created!
ItemB created!
ItemB1 created!
factory 2 working....
ItemA created!
ItemA2 created!
ItemB created!
ItemB2 created!
抽象工厂的效果就是,客户端不需要关注具体产品的生产过程。客户可以灵活选择不同的工厂来生产具体的产品。比如,通过配置选择不同的UI风格。
缺点是想增加产品,代价很高,需要修改所有的工厂类。适合产品固定的场景。