您的位置:首页 > 其它

设计模式系列(11)抽象工厂模式

2017-06-13 15:12 351 查看
1.概念

  抽象工厂模式是所有形态的工厂模式中最为抽象最为一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象。

备注:工厂模式要么生产香蕉、要么生产苹果、要么生产西红柿;但是不能生产一个产品组。抽象工厂能够生产一个产品组。

解释:

具体工厂在开闭原则下,能生产香蕉或者苹果或者梨子(产品等级结构)

抽象工厂在开闭原则下,能生产南方香蕉或南方苹果或南方梨子(产品族)

                                                   北方香蕉或苹果或梨子

重要区别:

工厂模式只能生产一个产品。(要么香蕉,要么苹果)

抽象工厂可以生产一个产品族(里面有很多产品组成)

2.模式中包含的角色及其职责

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

2).具体工厂(Concreter Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品。

3).抽象(Product)角色:抽象模式所创建的所有对象的父类,它负责描述所有实例所有公共的接口。

4).具体产品(Concrete Product)角色:抽象模式所创建的具体实例对象。

                       


               抽象工厂UML类图

3.示例代码:

abstractfactory.h

#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_

#include <iostream>

using namespace std;

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

class AbstractFactory
{
public:
virtual Fruit* CreateBanana() = 0;
virtual Fruit* CreateApple() = 0;
};

class NorthBanana : public Fruit
{
public:
virtual void SayName()
{
cout << "north banana" << endl;
}
};

class NorthApple : public Fruit
{
public:
virtual void SayName()
{
cout << "north apple" << endl;
}
};

class SourthBanana : public Fruit
{
public:
virtual void SayName()
{
cout << "Sourth banana" << endl;
}
};

class SourthApple : public Fruit
{
public:
virtual void SayName()
{
cout << "Sourth apple" << endl;
}
};

class NorthFactory : public AbstractFactory
{
public:
virtual Fruit* CreateBanana()
{
return new NorthBanana;
}

virtual Fruit* CreateApple()
{
return new NorthApple;
}
};

class SourthFactory : public AbstractFactory
{
public:
virtual Fruit* CreateBanana()
{
return new SourthBanana;
}

virtual Fruit* CreateApple()
{
return new SourthApple;
}
};

#endif /*_ABSTRACTFACTORY_H_*/


main.cpp

#include <iostream>
#include "abstractfactory.h"

using namespace std;

int main()
{
Fruit *fruit = NULL;
AbstractFactory *af = NULL;

af = new SourthFactory;
fruit = af->CreateApple();
fruit->SayName();
delete fruit;
fruit = af->CreateBanana();
fruit->SayName();
delete fruit;

af = new NorthFactory;
fruit = af->CreateApple();
fruit->SayName();
delete fruit;
fruit = af->CreateBanana();
fruit->SayName();
delete fruit;

delete af;
delete fruit;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: