您的位置:首页 > 其它

设计模式之抽象工厂模式

2017-08-19 14:16 260 查看
(一)概念:抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

(二)模式中包含的角色及其职责

1、抽象工厂(Creator)角色 

抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。

 

2、具体工厂( Concrete  Creator)角色

具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。

 

3、抽象(Product)角色

抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

 

4、具体产品(Concrete Product)角色

抽象模式所创建的具体实例对象



(三)抽象工厂模式的实现

#include
using namespace std;

class Fruit
{
public:
virtual void GetFruit() = 0;
};

class SouthApple: public Fruit
{
public:
void GetFruit()
{
printf("我是南方生产的苹果\n");
}
};

class NorthApple: public Fruit
{
public:
void GetFruit()
{
printf("我是北方生产的苹果\n");
}
};

class SouthPear: public Fruit
{
public:
void GetFruit()
{
printf("我是南方生产的梨\n");
}
};

class NorthPear: public Fruit
{
public:
void GetFruit()
{
printf("我是北方生产的梨\n");
}
};

class AbsFactory
{
public:
virtual Fruit* CreateApple() = 0;
virtual Fruit* CreatePear() = 0;
};

class SouthFactory: public AbsFactory
{
public:
Fruit * CreateApple()
{
return new SouthApple;
}
Fruit * CreatePear()
{
return new SouthPear;
}
};

class NorthFactory: public AbsFactory
{
public:
Fruit * CreateApple()
{
return new NorthApple;
}
Fruit * CreatePear()
{
return new NorthPear;
}
};

void func(AbsFactory *factory)
{
Fruit * f1 = factory->CreateApple();
Fruit * f2 = factory->CreatePear();

f1->GetFruit();
f2->GetFruit();

delete f1;
delete f2;

}

int main()
{
AbsFactory *factory = new SouthFactory;
func(factory);
delete factory;

AbsFactory *factory1 = new NorthFactory;
func(factory1);
delete factory1;

return 0;
}


(四)三种工厂模式的区别

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   

抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: