简单工厂模式+工厂方法模式

简单工厂模式+工厂方法模式,第1张

简单工厂模式

1、客户端与具体实现类解耦。
2、对于某些创建对象的过程比较复杂的情况。只需给工厂传参,然后工厂根据传入的参数返回对象,无需了解对象创建的具体过程。

代码示例

// 抽象水果类
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 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 NULL;
		}
	}
};

工厂的使用

void test01()
{
	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;
}

应用场景:
1、工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中业务逻辑太过复杂,不用频繁修改工厂类。
2、客户端只知道传入工厂的参数,对于如何创建对象并不关心。

缺点:
1、简单工厂模式在增加新功能时是通过修改源代码来实现的,这不符合开闭原则。
2、工厂类职责过重,不符合单一职责原则。

所以简单工厂模式并不在23种设计模式之列

简单工厂模式:
只需要创建一个工厂,通过传参给工厂返回不同的对象,用户不需要了解具体对象的创建过程,对象的创建都是工厂来完成的。

对于工厂类而言,如果要增加新的功能,就需要修改工厂类,这违背了开闭原则,除此之外,这个工厂类的职责太多,即要生产苹果,又要生产香蕉,还要生产梨,这违背了单一职责原则。

针对上述问题,进行改进。
·

工厂方法模式
// 抽象工厂
class AbstractFactory
{
public:
	virtual AbstractFruit* CreateFruit() = 0;
};
// 苹果工厂
class AppleFactory : public AbstractFactory
{
public:
	virtual AbstractFruit* CreateFruit() {
		return new Apple;
	}
};
// 香蕉工厂
class BananaFactory : public AbstractFactory
{
public:
	virtual AbstractFruit* CreateFruit() {
		return new Banana;
	}
};
// 梨工厂
class PearFactory : public AbstractFactory
{
public:
	virtual AbstractFruit* CreateFruit() {
		return new Pear;
	}
};

工厂的使用如下:

void test01()
{
	AbstractFactory* factory = NULL;
	factory = new AppleFactory();
	AbstractFruit* 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;
}

工厂方法模式:
通过将工厂抽象化,使对象的创建由专门的工厂创建,符合单一职责原则。
如果需要增加新的水果,则只需增加一个工厂类,不需要修改源代码,符合开闭原则。

优点:
1、不需要记住具体类名,甚至不需要记住传入参数,只需要知道生产所需对象的工厂就能得到新的对象。
2、实现了对象的创建和使用的分离。
3、系统的可扩展性变好,无需修改源类。

缺点:
1、增加了系统中类的个数,代码复杂度和理解难度加大。
2、增加了系统的抽象性。

总结:简单工厂模式 + 开闭原则 + 单一职责原则 = 工厂方法模式

工厂方法模式的使用场景:
1、客户端不知道所需对象的类。
2、抽象工厂类通过其子类来指定创建具体对象。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1499160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存