一、概述
(1)简单工厂模式并不是一个标准的设计模式,但是它太常用了,简单而又神奇
(2)在简单工厂模式中用于创建实例的方法通常是静态方法,因此又被称为静态工厂方法模式
(3)要点:如果需要什么,只需传入一个正确的参数,就可以获取所需要的对象,而无需知道其创建细节
(4)简单工厂模式定义:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建者的实例通常都具有共同的父类
二、简单工厂模式结构
简单工厂模式包含以下3个角色
(1)Factory(工厂角色)
(2)Product(抽象产品角色)
(3)ConcreteProduct(具体产品角色)
三、将对象的创建和使用分离的好处
1、防止用来实例化一个类的数据和代码在多个类中到处都是,解决代码重复、创建蔓延的问题
2、可以提供一系列名字完全不同的工厂方法,每一个·工厂方法对应一个构造函数,可以以一种更加可读、易懂的方式来创建对象
四、模式优点
1、实现了对象创建和使用的分离
2、客户端无须知道所创建的具体产品类的类名,只需知道具体产品类对应的参数即可
3、可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性
五、模式缺点
1、工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
2、增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度
3、系统扩展困难,一旦添加新的产品不得不修改工厂逻辑
4、由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好的扩展
六、简单工厂模式示例代码
#include<iostream>
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;
}