创建型模式之简单工厂模式

一、概述

(1)简单工厂模式并不是一个标准的设计模式,但是它太常用了,简单而又神奇

(2)在简单工厂模式中用于创建实例的方法通常是静态方法,因此又被称为静态工厂方法模式

(3)要点:如果需要什么,只需传入一个正确的参数,就可以获取所需要的对象,而无需知道其创建细节

(4)简单工厂模式定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建者的实例通常都具有共同的父类

二、简单工厂模式结构

简单工厂模式包含以下3个角色

(1)Factory(工厂角色)

(2)Product(抽象产品角色)

(3)ConcreteProduct(具体产品角色)

三、将对象的创建和使用分离的好处

1、防止用来实例化一个类的数据和代码在多个类中到处都是,解决代码重复、创建蔓延的问题

2、可以提供一系列名字完全不同的工厂方法,每一个·工厂方法对应一个构造函数,可以以一种更加可读、易懂的方式来创建对象

四、模式优点

1、实现了对象创建和使用的分离

2、客户端无须知道所创建的具体产品类的类名,只需知道具体产品类对应的参数即可

3、可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

五、模式缺点

1、工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响

2、增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度

3、系统扩展困难,一旦添加新的产品不得不修改工厂逻辑

4、由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好的扩展

六、简单工厂模式示例代码

#include
using namespace std;

class Person
{
public:
	Person()
	{
	}

	virtual void speak() const = 0;
};

class Woman : public Person
{
public:
	Woman()
	{
	}

protected:
	virtual void speak() const override
	{
		cout << "I am Woman" << endl;
	}
};

class Man : public Person
{
public:
	Man()
	{
	}
protected:
	virtual void speak() const override
	{
		cout << "I am Man" << endl;
	}
};

//简单工厂模式
class Factory
{
public:
	static Person* create(const char* name)
	{
		Person* temp = nullptr;
		if (strcmp(name, "M") == 0)
		{
			temp = new Man;
		}
		else if (strcmp(name, "W") == 0)
		{
			temp = new Woman;
		}
		else
		{
			return nullptr;
		}
		return temp;
	}
};
int main()
{
	Person* man = Factory::create("M");
	Person* woman = Factory::create("W");
	man->speak();
	woman->speak();

	delete man;
	delete woman;
	return 0;
}

你可能感兴趣的:(设计模式,简单工厂模式)