您的位置:首页 > 编程语言 > C语言/C++

C++设计模式----抽象工厂

2012-09-12 13:59 295 查看
抽象工厂是基于简单工厂的基础之上。因为在简单工厂:http://blog.csdn.net/zhangyulin54321/article/details/7970740

中可以了解到,它局限于为一类对象的创建,他们有共同的基类product。而抽象工厂可以为一组类对象的创建,可以为不同类提供对象创建的接口,就是为了解决创建一组相关或相互依赖的对象。

//product.h

#ifndef _PRODUCT_H_

#define _PRODUCT_H_

class ProductA

{

public:

virtual ~ProductA()=0;

protected:

ProductA();

private:

};

class ConcreteProductA1:public ProductA

{

public:

ConcreteProductA1();

~ConcreteProductA1();

protected:

private:

};

class ConcreteProductA2:public ProductA

{

public:

ConcreteProductA2();

~ConcreteProductA2();

protected:

private:

};

class ProductB

{

public:

virtual ~ProductB()=0;

protected:

ProductB();

private:

};

class ConcreteProductB1:public ProductB

{

public:

ConcreteProductB1();

~ConcreteProductB1();

protected:

private:

};

class ConcreteProductB2:public ProductB

{

public:

ConcreteProductB2();

~ConcreteProductB2();

protected:

private:

};

#endif

//product.cpp

#include"product.h"

#include<iostream>

using namespace std;

ProductA::ProductA()

{

cout<<"ProductA()"<<endl;

}

ProductA::~ProductA()

{

cout<<"~ProductA()"<<endl;

}

ConcreteProductA1::ConcreteProductA1()

{

cout<<"ConcreteProductA1()"<<endl;

}

ConcreteProductA1::~ConcreteProductA1()

{

cout<<"~ConcreteProductA1()"<<endl;

}

ConcreteProductA2::ConcreteProductA2()

{

cout<<"ConcreteProductA2()"<<endl;

}

ConcreteProductA2::~ConcreteProductA2()

{

cout<<"~ConcreteProductA2()"<<endl;

}

//////////////

ProductB::ProductB()

{

cout<<"ProductB()"<<endl;

}

ProductB::~ProductB()

{

cout<<"~ProductB()"<<endl;

}

ConcreteProductB1::ConcreteProductB1()

{

cout<<"ConcreteProductB1()"<<endl;

}

ConcreteProductB1::~ConcreteProductB1()

{

cout<<"~ConcreteProductB1()"<<endl;

}

ConcreteProductB2::ConcreteProductB2()

{

cout<<"ConcreteProductB2()"<<endl;

}

ConcreteProductB2::~ConcreteProductB2()

{

cout<<"~ConcreteProductB2()"<<endl;

}

//AbstratorFactory.h

#ifndef _FACTORY_H

#define _FACTORY_H

class ProductA;

class ProductB;

class AbstractFactory

{

public:

virtual~ AbstractFactory()=0;

virtual ProductA* createProductA()=0;

virtual ProductB* createProductB()=0;

protected:

AbstractFactory();

private:

};

class ConcreteFactory1:public AbstractFactory

{

public:

ConcreteFactory1();

virtual~ ConcreteFactory1();

ProductA* createProductA();

ProductB* createProductB();

protected:

private:

};

class ConcreteFactory2:public AbstractFactory

{

public:

ConcreteFactory2();

virtual~ ConcreteFactory2();

ProductA* createProductA();

ProductB* createProductB();

protected:

private:

};

#endif

//AbstratorFactory.cpp

#include"Factory.h"

#include"product.h"

#include<iostream>

using namespace std;

AbstractFactory::AbstractFactory()

{

cout<<"AbstractFactory()"<<endl;

}

AbstractFactory::~AbstractFactory()

{

cout<<"~AbstractFactory()"<<endl;

}

ConcreteFactory1::ConcreteFactory1()

{

cout<<"ConcreteFactory1()"<<endl;

}

ConcreteFactory1::~ConcreteFactory1()

{

cout<<"~ConcreteFactory1()"<<endl;

}

ProductA* ConcreteFactory1::createProductA()

{

return new ConcreteProductA1();

}

ProductB* ConcreteFactory1::createProductB()

{

return new ConcreteProductB1();

}

//////////////////

ConcreteFactory2::ConcreteFactory2()

{

cout<<"ConcreteFactory2()"<<endl;

}

ConcreteFactory2::~ConcreteFactory2()

{

cout<<"~ConcreteFactory2()"<<endl;

}

ProductA* ConcreteFactory2::createProductA()

{

return new ConcreteProductA2();

}

ProductB* ConcreteFactory2::createProductB()

{

return new ConcreteProductB2();

}

//main.cpp

#include<iostream>

#include"AbstratorFactory.h"

#include"product.h"

using namespace std;

void main()

{

AbstractFactory *af1=new ConcreteFactory1();

ProductA *pa=af1->createProductA();

ProductB *pb=af1->createProductB();

delete pa;

delete pb;

delete af1;

AbstractFactory *af2=new ConcreteFactory2();

ProductA *pa2=af2->createProductA();

ProductB *pb2=af2->createProductB();

delete pa2;

delete pb2;

delete af2;

}

可以看到与简单工厂相比,当我们创建一组对象(product1和product2)时候,我们只要维护一个创建对象(concreteFactory1),这样就简化了维护的成本和代价
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: