设计模式 C++简单工厂模式
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 C++简单工厂模式相关的知识,希望对你有一定的参考价值。
在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象。在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过程。而引入工厂模式,就是将创建类的这个步骤又工厂来帮我们完成,我们只需要去使用工厂里创建好的类即可。在使用工厂时,我们需要让工厂知道我们想要的一个对象,所以我们可以通过传参的方式去告诉工厂我们的需求
定义思想:在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
优点:
- 实现了客户端和具体实现类的解耦
- 客户端免除了直接创建产品对象的责任,而仅仅“消费”产品产品
- 客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
缺点:
- 想要增加新的产品类时需要修改源代码,不符合开闭原则
- 工厂类中集中了所有产品类的创建逻辑,如果这个类发生了问题。整个系统都要受到影响
适用场景:
- 工厂类负责创建的对象比较少
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:
由于简单工厂模式不符合开闭原则,所以大佬将该模式从24种设计模式中移除
代码实现(手机产品)
首先创建一个抽象手机类,指定具体产品手机必须具有指定功能,也就是产品类必须要重写该类中的方法
//抽象手机
class AbstractPhone
{
public:
virtual void ShowName() = 0;
};
具体产品的手机继承抽象手机类并对其方法进行重写
//华为
class Huawei : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Huawe Phone" << endl;
}
};
//小米
class Xiaomi : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Xiaomi Phone" << endl;
}
};
//苹果
class Apple : public AbstractPhone
{
public:
virtual void ShowName()
{
cout << "Apple Phone" << endl;
}
};
通过传入的参数来确定需要生成哪种手机
//手机工厂
class PhoneFactory
{
public:
static AbstractPhone* CreatePhone(string name)
{
if (name == "huawei")
//...生产细节
return new Huawei;
else if (name == "xiaomi")
//...生产细节
return new Xiaomi;
else if (name == "apple")
//...生产细节
return new Apple;
else
return nullptr;
}
};
测试:
void test()
{
//创建工厂
PhoneFactory* factor = new PhoneFactory;
//创建手机
AbstractPhone* phone;
//指定工厂需要创建的手机
phone = factor->CreatePhone("huawei");
phone->ShowName();
delete phone;
phone = factor->CreatePhone("xiaomi");
phone->ShowName();
delete phone;
phone = factor->CreatePhone("apple");
phone->ShowName();
delete phone;
delete factor;
}
运行截图:
推荐阅读设计模式 C++工厂方法模式
以上是关于设计模式 C++简单工厂模式的主要内容,如果未能解决你的问题,请参考以下文章