【设计模式】工厂方法模式

之前提到了 简单工厂模式 。

其主要缺点:

(1)简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响;

(2)工厂类代码会非常臃肿,违背高聚合原则,违背开闭原则。

那么如果实现开闭原则呢?

对于之前的“水果工厂”的例子,使用 工厂方法模式 进行完善,即将工厂也抽象出来,一种具体工厂生产特定的水果。

#include <iostream>
using namespace std;


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

//苹果
class Apple :public AbstractFruit
{
public:
	virtual void showName()
	{
		cout << "这是苹果" << endl;
	}
};

//香蕉
class Banana :public AbstractFruit
{
public:
	virtual void showName()
	{
		cout << "这是香蕉" << endl;
	}
};

//鸭梨
class Pear :public AbstractFruit
{
public:
	virtual void showName()
	{
		cout << "这是鸭梨" << endl;
	}
};


//抽象工厂
class AbstractFactory
{
public:
	virtual AbstractFruit* createFruit() = 0;
};

//实现苹果工厂
class AppleFactory :public AbstractFactory
{
public:
	virtual AbstractFruit* createFruit()
	{
		return new Apple;
	}
};

//实现香蕉工厂
class BananaFactory :public AbstractFactory
{
	virtual AbstractFruit* createFruit()
	{
		return new Banana;
	}
};

//实现鸭梨工厂
class PearFactory :public AbstractFactory
{
	virtual AbstractFruit* createFruit()
	{
		return new Pear;
	}
};

void test01()
{
	AbstractFactory* factory = NULL;
	AbstractFruit* fruit = NULL;

	//创建苹果
	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, int* argv[])
{
	test01();
	system("pause");
	return 0;
}

优点:

(1)不需要记住具体类名,甚至连具体参数都不用记忆;

(2)实现了对象创建和使用的分离;

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


缺点:

(1)增加系统中类的个数,复杂度和理解度增加;

(2)增加了系统的抽象性和理解难度。

应用场景:

(1)客户端不知道它所需要的对象的类。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值