C++ 简单工厂模式

本文介绍了简单工厂模式,一种创建型设计模式,用于根据参数创建不同类的实例。通过场景分析展示了其在商品价格计算中的应用,并提供了相关代码示例。简单工厂模式的优点包括责任分割和客户端无需直接创建产品,但缺点是扩展性较差,增加新产品需修改工厂类。适用场景为产品固定或数量较少,客户端只需传入参数即可。
摘要由CSDN通过智能技术生成


介绍

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

场景分析

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

在这里插入图片描述

二、代码展示

抽象产品类代码:

// 抽象类
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、客户端只需要知道传入工厂类的参数,对于如何创建不关心的情况下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值