一、简单工厂模式介绍
简单工厂模式的核心思想是用一个工厂类来根据输入的条件产生不同的类,再调用不同类的虚函数获得不同的结果。
简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。通俗的来讲就是一个工厂只做一件事,比如我要制造手机,那么这个工厂就只造手机,为什么呢,因为简单工厂返回的是一个具体的品类,并且它也能返回其他相关的品类,而这些品类都有许多共同的属性,这就需要使用基类来存放通用属性,例如手机的尺寸,屏幕的分辨率,CPU的型号。
如果把篮球与手机一起也作为工厂的产品,这就不合规矩了。
二、简单工厂模式应用场景
创建某些数量不多的相关类中的具体一个类对象时,比如经典的信息管理系统,学生类,教师类等继承于基本人员信息抽象类,工厂负责创建具体的这些类。
三、简单工厂模式优缺点
1.简单工厂模式优点
1. 客户端创建对象时只需要记住特定的参数,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)。
2. 创建对象不需要单独实例化,而是通过工厂类直接获取示例(实现复用)。
2.简单工厂模式缺点
1. 实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。
2. 不方便扩展子类。
四、代码示例
手机生产的简单工厂模式实例:
//手机基类
class Phone {
public:
//获取产品名
virtual string GetName() = 0;
};
//华为手机
class HWPhone : public Phone {
public:
string GetName() {
return "Huawei Phone";
}
};
//苹果手机
class IPhone : public Phone {
public:
string GetName() {
return "iphone";
}
};
//红米手机
class RMPhone : public Phone {
public:
string GetName() {
return "Redmi Phone";
}
};
//工厂类
class Factory {
public:
enum PHONE_TYPE {
HUAWEI, //华为手机
IPHONE, //苹果手机
REDMI //红米手机
};
//生产手机
Phone* CreatePhone(PHONE_TYPE type) {
Phone* pPhone = nullptr;
switch(type) {
case PHONE_TYPE::HUAWEI:
pPhone = new HWPhone(); //华为手机
break;
case PHONE_TYPE::IPHONE:
pPhone = new IPhone(); //苹果手机
break;
case PHONE_TYPE::REDMI:
pPhone = new RMPhone(); //红米手机
break;
default:
break;
}
return pPhone;
}
};
//main.cpp
//main函数测试代码
int main() {
Factory* pFactory = new Factory();
HWPhone* phwPhone = (HWPhone*)pFactory->CreatePhone(HWPhone);
std::cout << phwPhone->GetName(); //输出"Huawei Phone"
delete pFactory;
delete phwPhone
return 0;
}
五、略提工厂方法模式、抽象工厂模式
1.工厂方法模式
工厂方法模式修正了简单工厂模式中不遵守开放——封闭原则。工厂方法模式把选择判
断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。
例如我们可以直接通过华为工厂、苹果工厂、红米工厂分别制造华为手机、苹果手机、红米手机。
2.抽象工厂模式
抽象工厂模式定义了一个创建一系列相关或相互依赖的接口,而无需指定它们的具体类。如下图所示,假设华为工厂生产华为手机和华为篮球,苹果工厂生产苹果手机和苹果篮球,那么最后的接口工厂既可以生产华为的手机和篮球也可以生产苹果的手机和篮球。