设计模式--工厂模式

目录

一、简单工厂模式

1、理论

1.1 优点

1.2 缺点

2、代码

二、工厂方法模式

1、理论

1.1 优点

1.2 缺点

2、代码

三、简单工厂与工厂方法模式适用场景

1、简单工厂适用场景

2、工厂方法适用场景

四、抽象工厂模式

1、理论

2、代码


一、简单工厂模式

1、理论

1.1 优点

①客户端和具体实现类解耦。

②对于某些创建对象过程复杂的类,我们也不用考虑。

1.2 缺点

①增加功能需要修改工厂类源码,不符合开闭原则一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

②工厂类职责过重,如果这个类发生问题,会影响很多使用这个工厂的模块

2、代码

#include <iostream>
using namespace std;

//抽象水果
class AbstractFruit
{
public:
	virtual void ShowName() = 0;
};

//具体水果1
class Apple: public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Apple!" << endl;
	}
};

//具体水果2
class Banana : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Banana!" << endl;
	}
};

//具体水果3
class Pear : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Pear!" << endl;
	}
};

//工厂类
class FruitFactory
{
public:
	static AbstractFruit* CreateFruit(string flag)
	{
		if (flag == "Apple")
		{
			//创建复杂对象相关操作...
			return new Apple;
		}
		else if (flag== "Banana")
		{
			//创建复杂对象相关操作...
			return new Banana;
		}
		else if (flag == "Pear")
		{
			//创建复杂对象相关操作...
			return new Pear;
		}
		else
		{
			return nullptr;
		}
	}
};

void test01(void)
{
	//创建工厂,通过工厂来创建对象
	FruitFactory* factory = new FruitFactory;
	AbstractFruit* fruit = factory->CreateFruit("Apple");
	fruit->ShowName();
	delete fruit;

	fruit = factory->CreateFruit("Banana");
	fruit->ShowName();
	delete fruit;

	fruit = factory->CreateFruit("Pear");
	fruit->ShowName();
	delete fruit;

	delete factory;
}

int main(int argc, char *argv[])
{
	test01();
	system("pause");
	return 0;
}

二、工厂方法模式

1、理论

简单工厂模式+“开闭原则”=工厂方法模式

②为解决简单工厂模式工厂类不符合开闭原则的问题,为每个具体类都实现一个对应的工厂类,导致一个新问题,类的数量越来越多,增加维护成本。

1.1 优点

①不需要记住具体类名,甚至连具体参数都不需要记忆。

②实现了对象创建和使用的分离。

③系统的可扩展性也就变得非常好,无需修改接口和原类。

1.2 缺点

①增加系统中类的个数,复杂度和理解难度增加。

②增加了系统的抽象性和理解难度。

2、代码

#include <iostream>
using namespace std;

//抽象水果
class AbstractFruit
{
public:
	virtual void ShowName() = 0;
};

//具体水果1
class Apple: public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Apple!" << endl;
	}
};

//具体水果2
class Banana : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Banana!" << endl;
	}
};

//具体水果3
class Pear : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "I am Pear!" << endl;
	}
};

//抽象水果工厂
class AbstractFruitFactory
{
public:
	virtual AbstractFruit* CreateFruit() = 0;
};

//具体水果工厂1
class AppleFactory :public AbstractFruitFactory
{
public:
	virtual AbstractFruit* CreateFruit()
	{
		//其它操作...
		return new Apple;
	}
};

//具体水果工厂2
class BananaFactory :public AbstractFruitFactory
{
public:
	virtual AbstractFruit* CreateFruit()
	{
		//其它操作...
		return new Banana;
	}
};

//具体水果工厂3
class PearFactory :public AbstractFruitFactory
{
public:
	virtual AbstractFruit* CreateFruit()
	{
		//其它操作...
		return new Pear;
	}
};

void test01(void)
{
	AbstractFruitFactory* factory = nullptr;//水果工厂
	AbstractFruit* fruit = nullptr;//水果
	
	//创建苹果工厂
	factory = new AppleFactory;
	fruit = factory->CreateFruit();
	fruit->ShowName();
	delete fruit;
	delete factory;

	factory = new BananaFactory;
	fruit = factory->CreateFruit();
	fruit->ShowName();
	delete fruit;
	delete factory;

	factory = new PearFactory;
	fruit = factory->CreateFruit();
	fruit->ShowName();
	delete fruit;
	delete factory;
}

int main(int argc, char *argv[])
{
	test01();
	system("pause");
	return 0;
}

三、简单工厂与工厂方法模式适用场景

1、简单工厂适用场景

①工厂类负责创建的对象比较少,由于创建的对象较少。不会造成工厂方法中的业务逻辑太过复杂。

②客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

2、工厂方法适用场景

①客户端不知道它所需要的对象的类。

②抽象工厂类通过其子类来指定创建哪个对象。

四、抽象工厂模式

1、理论

抽象工厂针对的是产品族,而不是产品等级结构

①产品族:同一产地或同一厂商,功能不同

②产品等级:功能相同,产地或者厂商不同。

2、代码

#include <iostream>
using namespace std;

//抽象苹果
class AbstractApple
{
public:
	virtual void ShowName() = 0;
};

//抽象香蕉
class AbstractBanana
{
public:
	virtual void ShowName() = 0;
};

//抽象梨
class AbstractPear
{
public:
	virtual void ShowName() = 0;
};

//中国苹果
class ChinaApple :public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "I am ChinaApple" << endl;
	}
};

//美国苹果
class USAApple :public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "I am USAApple" << endl;
	}
};

//日本苹果
class JapanApple :public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "I am JapanApple" << endl;
	}
};

//中国香蕉
class ChinaBanana :public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "I am ChinaBanana" << endl;
	}
};

//美国香蕉
class USAABanana :public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "I am USABanana" << endl;
	}
};

//日本香蕉
class JapanBanana :public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "I am JapanBanana" << endl;
	}
};

//中国梨
class ChinaPear :public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "I am ChinaPear" << endl;
	}
};

//美国梨
class USAAPear :public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "I am USAPear" << endl;
	}
};

//日本梨
class JapanPear :public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "I am JapanPear" << endl;
	}
};

//抽象工厂--针对产品族
class AbstractFactory
{
public:
	virtual AbstractApple* CreatApple() = 0;
	virtual AbstractBanana* CreatBanana() = 0;
	virtual AbstractPear* CreatPear() = 0;
};

//中国工厂
class ChinaFactory :public AbstractFactory
{
public:
	virtual AbstractApple* CreatApple()
	{
		return new ChinaApple;
	}
	virtual AbstractBanana* CreatBanana()
	{
		return new ChinaBanana;
	}
	virtual AbstractPear* CreatPear()
	{
		return new ChinaPear;
	}
};

//美国工厂
class USAFactory :public AbstractFactory
{
public:
	virtual AbstractApple* CreatApple()
	{
		return new USAApple;
	}
	virtual AbstractBanana* CreatBanana()
	{
		return new USAABanana;
	}
	virtual AbstractPear* CreatPear()
	{
		return new USAAPear;
	}
};

//日本工厂
class JapanFactory :public AbstractFactory
{
public:
	virtual AbstractApple* CreatApple()
	{
		return new JapanApple;
	}
	virtual AbstractBanana* CreatBanana()
	{
		return new JapanBanana;
	}
	virtual AbstractPear* CreatPear()
	{
		return new JapanPear;
	}
};

void test01(void)
{
	AbstractFactory* factory = nullptr;
	AbstractApple* apple = nullptr;
	AbstractBanana* banana = nullptr;
	AbstractPear* pear = nullptr;

	//中国工厂
	factory = new ChinaFactory;
	apple = factory->CreatApple();
	banana = factory->CreatBanana();
	pear = factory->CreatPear();
	apple->ShowName();
	banana->ShowName();
	pear->ShowName();
	delete apple;
	delete banana;
	delete pear;
	delete factory;

	//美国工厂
	factory = new USAFactory;
	apple = factory->CreatApple();
	banana = factory->CreatBanana();
	pear = factory->CreatPear();
	apple->ShowName();
	banana->ShowName();
	pear->ShowName();
	delete apple;
	delete banana;
	delete pear;
	delete factory;

	//日本工厂
	factory = new JapanFactory;
	apple = factory->CreatApple();
	banana = factory->CreatBanana();
	pear = factory->CreatPear();
	apple->ShowName();
	banana->ShowName();
	pear->ShowName();
	delete apple;
	delete banana;
	delete pear;
	delete factory;
}

int main(int argc, char *argv[])
{
	test01();
	system("pause");
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值