C++ 简单工厂模式

文章目录

  • 介绍
  • 场景分析
  • 二、代码展示
  • 简单工厂的优点和缺点
    • 优点
    • 缺点
  • 总结


介绍

简单工厂模式是属于创建型模式(工厂模式、抽象工厂模式、单例模式、建造者模式),又称之为静态工厂模式,它不属于23中设计模式之一,在简单工厂中可以根据参数的不同返回不同类的实例,简单工厂模式专门定义了一个工厂类来创建其他类的实例(其他类有一个共同的基类,使用了多态),简单工厂模式是工厂模式中最简单使用的一种模式。

场景分析

当我们去超时购物的时候,收银员可以扫描不同的商品,可以显示出不同的价格,我们可以把商品看做是一个基类,当扫描商品时候,工厂类根据不同的商品生成具体的商品,得到商品的价格。这就是简单工厂模式的案例,UML如图所示:

C++ 简单工厂模式_第1张图片

二、代码展示

抽象产品类代码:

// 抽象类
class AbstratcGoods
{
public:
	// 得到商品价格
	virtual double GetSpice() = 0;
private:
	double spice;
};

具体产品实现代码:

// 具体实现 香蕉
class BananaGoods : public AbstratcGoods
{
public:
	virtual double GetSpice();
};
//具体实现 苹果
class AppleGoods : public AbstratcGoods
{
public:
	virtual double GetSpice();
};

double Goods::BananaGoods::GetSpice()
{
	return 3.5;
}
double Goods::AppleGoods::GetSpice()
{
	return 5.5;
}

简单工厂核心代码:

// 商品类型
enum GoodsEnum
{
	BananaEnum,
	AppleEnum
};

// 商品工厂
class GoodsFactory
{
public:
	// 创建具体商品
	AbstratcGoods *Create(GoodsEnum type);
};
AbstratcGoods * Goods::GoodsFactory::Create(GoodsEnum type)
{
	switch (type)
	{
	case Goods::BananaEnum:
		return new BananaGoods();
	case Goods::AppleEnum:
		return new AppleGoods();
	default:
		return NULL;
	}
}

调用代码:

#include "GoodsFactory.h"
using namespace std;
using namespace Goods;

int main()
{
	GoodsFactory *factory = new GoodsFactory;
	AbstractGoods *banana = factory->Create(GoodsEnum::BananaEnum);
	cout << "banana spice : " << banana->GetSpice() << endl;
	AbstractGoods *apple = factory->Create(GoodsEnum::AppleEnum);
	cout << "apple spice : " << apple->GetSpice() << endl;

	delete apple;
	delete banana;
	delete factory;

	apple = NULL;
	banana = NULL;
	factory = NULL;

	system("pause");
	return 0;
}

简单工厂的优点和缺点

优点

工厂类可以决定创建产品的实例,客户端不需要直接去创建,实现了责任分割,客户端也无需知道产品类的类名,只需要产品类的基类就可以了,可以根据外界给定的信息,决定创建的具体对象。

缺点

工厂类集中了实例创建的逻辑,违背了开源封闭原则,当我们此时增加梨(PearGoods),时候就需要修改工厂类。在产品类型比较多的时候,不利于系统的维护。

总结

1、工厂类负责创建的对象固定或者对象比较少。
2、客户端只需要知道传入工厂类的参数,对于如何创建不关心的情况下。

你可能感兴趣的:(C/C++)