【2013.1.14】不知道该起个什么名字,就叫小明的爸爸吧。——AbstractFactory

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

///2013.1.14

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

今天我们要继续讲Factory的衍生模式,

——AbstractFactory模式。


【核心】将Factory抽象(有点……废话)。


还是先来看一下UML图:

【2013.1.14】不知道该起个什么名字,就叫小明的爸爸吧。——AbstractFactory_第1张图片


其实这个衍生官方并没有明确说这个词,

只是按照我的认识去理解的。

它与Factory最大的区别在于:

如果Factory是一个生产不同产品的工厂的话,

那AbstractFactory就是生产不同品牌的产品的工厂的抽象


简而言之,

Factory是抽象了产品,

AbstractFactory是抽象了工厂。


一般而言,

一般编程者比较少使用Factory模式,

代之的是使用AbstractFactory模式,

原因很简单,

抽象一个产品,与抽象一个生产不同产品的工厂相比,

后者更为实用。


我们继续上一个例子,

同样是生产iPhone5sMini与iPodTouchLarge的两个厂商:

正牌厂商蘋果公司与山寨厂商苹果公司都会生产这两个产品,

产品种类相同,但是质量不同,

自然就会想到他们都有一个母公司叫做X果公司,

那么这个X果公司就是他们的抽象工厂了。


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

///2013.1.15

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

下面我们给出AbstractFactory模式的实例代码。

p.s.为方便理解,只是使用了一个产品(iPhone),但是这是可以无限增加的,只要Factory需要就Ok。


Product.h

#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class IPhone5
{
public:
	IPhone5(){}
	~IPhone5(){}
};

class MadeByApple: public IPhone5
{
public:
	MadeByApple();
};

class MadeByEpple:public IPhone5
{
public:
	MadeByEpple();
};

#endif

Product.cpp

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

MadeByApple::MadeByApple()
{
	std::cout<<"Produced an Apple iPhone"<<std::endl;
}

MadeByEpple::MadeByEpple()
{
	std::cout<<"Produced an Epple iPhone"<<std::endl;
}

Factory.h

#ifndef _FACTORY_H_
#define _FACTORY_H_

class IPhone5;

enum
{
	Apple,
	Epple
};

class Factory
{
public:
	virtual IPhone5* create()=0;
protected:
	~Factory(){}
	Factory(){}
};

class AppleFactory:public Factory
{
public:
	IPhone5* create();
	AppleFactory(){}
};

class EppleFactory:public Factory
{
public:
	IPhone5* create();
	EppleFactory(){}
};

#endif

Factory.cpp

#include "Factory.h"
#include "Product.h"

IPhone5* AppleFactory::create()
{
		return new MadeByApple();
}

IPhone5* EppleFactory::create()
{
		return new MadeByEpple();
}

Main.cpp

#include"Factory.h"
#include"Product.h"

int main(int argc,char* argv[])
{
	Factory* factory[2];
	IPhone5* iPhone5;

	factory[Apple] = new AppleFactory();
	factory[Epple] = new EppleFactory();

	iPhone5 = factory[Apple]->create();
	iPhone5 = factory[Epple]->create();
	
	return 0;
}

输出结果:

你可能感兴趣的:(【2013.1.14】不知道该起个什么名字,就叫小明的爸爸吧。——AbstractFactory)