3种工厂模式详解

本文详细介绍了工厂方法模式的三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式适用于产品固定的场景,但不支持产品扩展。工厂方法模式允许扩展增加产品,而抽象工厂模式不仅支持产品拓展,还能创建产品族,提供了更高的灵活性。文章通过水果工厂的示例说明了三种模式的区别和应用场景。
摘要由CSDN通过智能技术生成

1、工厂方法模式

1.1、简单工厂模式

定义:定义了一个创建对象的类,由这个类来封装实例化对象的行为。

举例:(我们举一个水果工厂的例子)

水果工厂一共生产三种类型的水果:apple,pear,banana。通过工厂类(Factory)实例化这三种类型的对象。类图如下:

#include<iostream>
using namespace std;
class Produce;//声明产品类 
class Factory//工厂类
{
public:
	Factory() {}
	~Factory() {}
	virtual Produce* create_produce(string class_name, string name) = 0;
	//工厂生产产品,这里的纯虚函数是为了让子工厂生产产品
	//返回的是一个产品类指针,这就代表了一个产品
	//这里的name参数是为了返回想要的产品qwq 
};
class Produce
{
public:
	Produce() {}
	~Produce() {}
	virtual void show_myname() = 0;//这里定义的纯虚函数是为了让派生类去实现这个函数,有纯虚函数的类是抽象类 
};
//现在我要开始创建具体的产品了
class Apple :public Produce//这是一个具体的苹果类 
{
private:
	string name;
public:
	Apple(string new_name = "")
	{
		this->name = new_name;
	}
	virtual void show_myname()//重写父类函数 
	{
		cout << "我的名称是:" << name << endl;
	}
};
class Pear :public Produce//这是一个具体的梨类 
{
private:
	string name;
public:
	Pear(string new_name = "")
	{
		this->name = new_name;
	}
	virtual void show_myname()//重写父类函数
	{
		cout << "我的名称是:" << name << endl;
	}
};
class Badfruits :public Produce//这是一个具体的坏水果类 
{
private:
	string name;
public:
	Badfruits() {}
	virtual void show_myname()//重写父类函数
	{
		cout << "此产品已经过期!!" << endl;
	}
};
//下面开始创建具体的工厂类 
class Factory_fruits :public Factory//这是个水果工厂类
{
public:
	Factory_fruits() {}
	~Factory_fruits() {}
	virtual Produce* create_produce(string class_name, string name)
	{
		if (class_name == "apple")
		{
			Produce* my_produce = new Apple(name);//创建name的apple产品 
			return my_produce;
		}
		else if (class_name == "pear")
		{
			Produce* my_produce = new Pear(name);//创建name的pear产品
			return my_produce;
		}
		else
		{
			Produce* my_produce = new Badfruits();//创建name的pear产品
			return my_produce;
		}
	}
};
//初期的搭建工作已经完成,总结一下,我们搭建了两个抽象类:工厂类,产品类;
												//产品派生类:苹果类,梨类,坏水果类
												//工厂派生类:水果工厂类。
												//现在我们要用这些东西了
int main()
{
	Factory* my_factory_fruits = new Factory_fruits();//创建一个抽象工厂对象"升级"为水果工厂
													//这里的"升级"是我的理解 ,事实上是类型转换 
	Produce* my_produce_apple = my_factory_fruits->create_produce("apple", "红富士");
	//创建抽象产品对象,"升级"为水果工厂加工出来的apple,红富士 
	Produce* my_produce_pear = my_factory_fruits->create_produce("pear", "冰糖雪梨");
	//创建抽象产品对象,"升级"为水果工厂加工出来的pear,冰糖雪梨
	Produce* my_produce_banana = my_factory_fruits->create_produce("banana", "大香蕉");
	//创建抽象产品对象,"升级"为水果工厂加工出来的banana,大香蕉,但是工厂不能生产banana,所以只能生产badfruit坏水果 
	my_produce_apple->show_myname();
	//产品显示自己的名称 
	my_produce_pear->show_myname();
	//产品显示自己的名称
	my_produce_banana->show_myname();
	//产
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值