一,定义
简单工厂模式:创建型模式之一。在简单工厂模式中,客户可以根据传入参数的不同,可以得到不同类的实例。在简单工厂模式中专门设计了一个工厂类负责其他类的实例化,而这些类往往拥有相同的基类。
(工厂类中需要一个静态工厂方法,方便外部(客户)调用)
二,类图
![](https://i-blog.csdnimg.cn/blog_migrate/d8b52d8564b21b2eee13fb492e78efc6.png)
三,成员职责
工厂角色:这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象产品角色:工厂所创建的所有对象的父类,它负责定义所有实例共有的公共接口。
具体产品角色:工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
四,实现
我们提供以下场景:
有一个水果的抽象类,有苹果,香蕉和鸭梨继承于这个抽象类,并且实现抽象方法。
设计一个工厂类,客户可以根据自己的需要选择购买苹果,还是香蕉,还是鸭梨,来返回具体类的指针,完成购买。
![](https://i-blog.csdnimg.cn/blog_migrate/1b764e6aa0675f7114aa53b4ce433b6f.png)
抽象水果接口(抽象产品类)
class fruit
{
public:
virtual void sold() = 0;
};
苹果(具体产品类)
class apple : public fruit
{
public:
void sold() override
{
cout << "苹果被买了" << endl;
}
};
香蕉(具体产品类)
class banana : public fruit
{
public:
void sold() override
{
cout << "香蕉被买了" << endl;
}
};
鸭梨(具体产品类)
class pear : public fruit
{
public:
void sold() override
{
cout << "鸭梨被买了" << endl;
}
};
工厂类(factory)
class fruit_factory
{
//根据传入的参数的不同,返回不同类的实例
public:
static fruit* createyfruit(string name)
{
if (name == "apple")
{
return new apple;
}
else if (name == "banana")
{
return new banana;
}
else if (name == "pear")
{
return new pear;
}
else
{
return nullptr;
}
}
};
测试方法与主函数
void client()
{
fruit_factory* factory = new fruit_factory;
fruit* f = nullptr;
//购买苹果
f = factory->createyfruit("apple");
f->sold();
delete f;
//购买香蕉
f = factory->createyfruit("banana");
f->sold();
delete f;
//购买鸭梨
f = factory->createyfruit("pear");
f->sold();
delete f;
delete factory;
}
int main()
{
client();
return 0;
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/dc81045bfaddb6173b205e888951a603.png)
五,优缺点分析
优点:
工厂类包含必要的判断逻辑,客户只需要根据传入外界给定不同的参数,就可以从工厂获得不同的具体产品,这样客户就不用知道对象是如何创建和组织的。简单工厂模式实现了对象创建和使用分离
缺点:
工厂类的责任过重,如果工厂出现问题,那么所有客户端都会牵连
如果新增具体产品类,需要直接更改工厂类中的代码,违背了开闭原则
由于工厂类使用了静态工厂方法,是工厂类无法形成基于继承的等级结构
六,适用场景
工厂类负责创建的对象比较少时(不会造成工厂方法中的业务逻辑太过复杂)
客户端对如何创建对象不关心,只知道传入工厂的参数