您的位置:首页 > 其它

设计模式之——工厂模式(FactoryMethodPattern)

2016-02-22 11:43 465 查看
工厂模式

简单工厂模式每次添加一个产品子类都必须在工厂类中添加一个判断分支,这样违背了开放-封闭原则,因此,工厂模式就是为了解决这个问题而产生的。

既然每次都要判断,那我就把这些判断都生成一个工厂子类,这样,每次添加产品子类的时候,只需再添加一个工厂子类就可以了。这样就完美的遵循了开放-封闭原则。但这其实也有问题,如果产品数量足够多,要维护的量就会增加,好在一般工厂子类只用来生成产品类,只要产品子类的名称不发生变化,那么基本工厂子类就不需要修改,每次只需要修改产品子类就可以了。

常用的场景

基本与简单工厂模式一致,只不过是改进了简单工厂模式中的开放-封闭原则的缺陷,使得模式更具有弹性。将实例化的过程推迟到子类中,由子类来决定实例化哪个。

优点:基本与简单工厂模式一致,多的一点优点就是遵循了开放-封闭原则,使得模式的灵活性更强。

缺点:与简单工厂模式差不多。



实例代码

//AbstractFactory.h
#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_
#include "AbstractProduct.h"

class AbstractFactory
{
public:
virtual AbstractProduct* CreateProduct()=0;
};

class FactoryA :public AbstractFactory
{
public:
AbstractProduct* CreateProduct();
};

class FactoryB :public AbstractFactory
{
public:
AbstractProduct* CreateProduct();
};

#endif


//AbstractFactory.cpp
#include "stdafx.h"
#include "AbstractFactory.h"

AbstractProduct* FactoryA::CreateProduct()
{
return new ProductA;
}

AbstractProduct* FactoryB::CreateProduct()
{
return new ProductB;
}


//AbstractProduct.h
#ifndef _ABSTRACTPRODUCT_H_
#define _ABSTRACTPRODUCT_H_

class AbstractProduct
{
public:
virtual void Operation() = 0;
};

class ProductA:public AbstractProduct
{
public:
void Operation();
};

class ProductB:public AbstractProduct
{
public:
void Operation();
};

#endif
//AbstractProduct.cpp
#include "stdafx.h"
#include "AbstractProduct.h"
#include <iostream>
using std::cout;
using std::endl;

void ProductA::Operation()
{
cout << "ProductA::Operation()" << endl;
}

void ProductB::Operation()
{
cout << "ProductB::Operation()" << endl;
}


// FactoryMethodPattern.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "AbstractFactory.h"

int _tmain(int argc, _TCHAR* argv[])
{
AbstractFactory* pFactory = new FactoryA;
AbstractProduct* pProductA = pFactory->CreateProduct();
pProductA->Operation();
delete pProductA;
pProductA = NULL;
delete pFactory;
pFactory = NULL;

pFactory = new FactoryB;
AbstractProduct* pProductB = pFactory->CreateProduct();
pProductB->Operation();
delete pProductB;
pProductB = NULL;
delete pFactory;
pFactory = NULL;

return 0;
}


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