设计模式:简单工厂模式

简单工厂模式不是一个标准的设计模式,但却十分常用。

1. 简单工厂的概念

提供一个创建对象的实例的功能,而无需关心其具体的实现;被创建的类型可以是接口、抽象类、也可以是具体的类。

简单工厂的本质是:选择实现。

重点在选择,实现已经做好了的;而实现是在实现类中实现的,不是在简单工厂中实现的。

简单工厂的主要目的:在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦;如果当具体实现发生变化时,就不会变动客户端,这个变化会被简单工厂吸收和屏蔽掉。

简单工厂中,只会暴露接口和简单工厂给客户端,而实现类,是不会暴露给客户端的。

在这里插入图片描述

看代码可能会好看一点:

class API//api接口
{
public:
	virtual void Show(const string& s) = 0;//抽象类
};


class ImplA : public API//实现类A
{
public:
	virtual void Show(const string& s) override
	{
		cout << "ImplA : " << s << endl;
	}
};

class ImplB : public API//实现类B
{
public:
	virtual void Show(const string& s) override
	{
		cout << "ImplB : " << s << endl;
	}
};

class Factory//简单工厂
{
public:
	//返回一个API对象,声明为static,可直接使用类名 + 作用域限定符访问
	static API* CreateObject(int choice)
	{
		switch (choice)
		{
		case 1 :
			return new ImplA;
		case 2 :
			return new ImplB;
		default:
			return nullptr;
		}
	}
};

int main()
{
	shared_ptr<API> api(Factory::CreateObject(1));
	// 创建一个API对象,这里使用了智能指针,避免内存泄漏
	api->Show("dont worry, this is a simple test");

	return 0;
}

程序输出结果为:

在这里插入图片描述

2. 简单工厂的优缺点

优点

  1. 帮助封装:让组件外部能够真正面向接口编程;
  2. 解耦:通过简单工厂,实现了客户端和具体实现类的解耦;客户端根本不知道具体是谁来实现的,也不知道具体如何实现的,客户端只知道通过工厂获取它需要的接口对象;

缺点

  1. 可能增加客户端复杂度:如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也会暴露部分内部实现,这种情况下,可使用配置文件的方式来实现;
  2. 不方便扩展子工厂:使用静态方法来创建接口,就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。一般不会为简单工厂创建子类。

3. 何时选用简单工厂?

  1. 如果想要完全封装隔离具体实现让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口类,而无需关心具体的实现;
  2. 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂中来,从而实现集中管理和控制。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值