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

简单工厂模式:

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、抽象工厂类通过其子类来指定创建具体对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值