设计模式之简单工厂模式-我简单,我实用!

一、简单工厂模式的概念

简单工厂模式属于类的创建型模式 ,又叫做静态工厂方法模式。根据传入的参数类型不同,通过专门定义一个类来负责创建其他类的实例,被创建的实例有一个共同的父类。

简单工程模式不属于23中设计模式,但因为其使用简单,在软件设计中经常被使用。

二、简单工厂模式使用场景

1、工厂类负责创建的对象比较少,业务逻辑比较简单、变化不大。
2、客户端只需知道传入工厂类的参数,对于如何创建对象不用关心。

三、简单工厂模式构建方法

1、构建工厂类

工厂类是简单工厂模式的核心, 它负责实现创建所有实例的内部逻辑,该工厂类可以被外界直接调
用,创建所需的产品对象。

2、构建抽象产品类

简单工厂模式所创建的所有产品对象的父类,它负责描述所有实例所共有的公共接口。

3.构建具体产品类

简单工厂模式所创建的具体产品实例对象。

四、简单工厂模式的示例

// SimpleFactory.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

// 水果基类
class Fruit
{
public:
	Fruit() {};
	~Fruit() {};
	virtual void printName() = 0;
};

// 具体水果-香蕉
class Banana : public Fruit
{
public:
	Banana() {};
	~Banana() {};
	void printName() 
	{
		cout << "My name is Banana." << endl;
	}
};

// 具体水果-苹果
class Apple : public Fruit
{
public:
	Apple() {};
	~Apple() {};
	void printName()
	{
		cout << "My name is Apple." << endl;
	}
};

// 工厂类
class Factory
{
public:
	Factory() {};
	~Factory() {};
	
	enum FRUIT_TYPE
	{
		BANANA_TYPE,
		APPLE_TYPE
	};

	Fruit *CreatFruit(FRUIT_TYPE type)
	{
		Fruit *pFruit = nullptr;
		switch (type)
		{
		case FRUIT_TYPE::BANANA_TYPE:
			pFruit = new Banana();
			break;
		case FRUIT_TYPE::APPLE_TYPE:
			pFruit = new Apple();
			break;
		default:
			break;
		}
		return pFruit;
	}
};

#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
int main()
{
	Factory *pFactory = nullptr;
	Fruit *pFruit = nullptr;

	pFactory = new Factory();

	// 香蕉
	pFruit = pFactory->CreatFruit(Factory::BANANA_TYPE);
	pFruit->printName();

	DELETE_PTR(pFruit);

	// 苹果
	pFruit = pFactory->CreatFruit(Factory::APPLE_TYPE);
	pFruit->printName();

	DELETE_PTR(pFruit);
	DELETE_PTR(pFactory);

    std::cout << "Hello World!\n";
	
	getchar();
}

运行输出如下:
在这里插入图片描述

五、简单工厂模式的优缺点

优点:

1、工厂类包含了必要的逻辑判断,根据传入的参数类型来创建对应的产品,客户端仅负责“消费”产品即可,实现了对象创建和使用的分离。
2、客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可。

缺点:

1、违反了高内聚责任分配原则,工厂类集中了所有产品的创建逻辑,职责过重,一旦无法正常工作,整个系统都将受到影响。
2、添加新产品就不得不修改工厂类,当产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

能力有限,如有错误,多多指教。。。

posted @ 2020-01-05 20:28  ISmileLi  阅读(3)  评论(0编辑  收藏  举报