一,动机
假设有这么一个软件应用场景,一个软件系统可以提供多个外观不同的按钮,这些按钮源自于一个抽象按钮,子按钮在继承抽象按钮后做了相应的实现。如果我们在使用这些按钮时,不需要具体知道这些具体按钮的名字,只需要知道表示那个按钮的标识符,并提供一个调用方法即可。(熟悉Win32编程的朋友可是想想CreateWindow这个函数)
这样,传入该参数即可返回一个响应的按钮对象。
这种思想,即为简单工厂
二,定义
定义:简单工厂模式又称为静态工厂模式,属于创建型模式。在简单工厂模式中,可以根据参数不同返回不同类的实例。
三,模式结构
1.Factory 工厂角色
负责创建所有实例的内部逻辑
2.Product 抽象产品角色
工厂所创建的所有对象的父类
3.ConcreteProduct 具体产品角色
工厂的创建目标
四,代码实例
这里,我将使用 学生与学校之间的例子。
学校可以培养 本科生,研究生等。当(企业)需要某学位的学生时,只需要调用学校提供的方法,就能方便的聘用一个学生。
UML图为:
抽象的学生类
class Student
{
public:
virtual void Say()=0;
};
具体的两个学生子类
class UnderGraduate: public Student
{
public:
void Say()
{
cout<<"我是本科生......很高兴得到聘用"<<endl ;
}
};
class PostGraduate: public Student
{
public:
void Say()
{
cout<<"我是研究生......初次见面,多多关照"<<endl ;
}
};
学校,即工厂
class StudentFactory
{
public:
static Student* produceStudent(string level)
{
try
{
if(level =="UnderGraduate")
{
cout<<"学校培养 本科生"<<endl;
return new UnderGraduate();
}
if(level==("PostGraduate"))
{
cout<<"学校培养 研究生"<<endl;
return new PostGraduate();
}
else
{
throw UnknownStudent("没有这种学位");
}
}
catch(UnknownStudent &e)
{
cout<<e.GetErrInfo()<<endl ;
}
return nullptr;
}
};
自定义的异常
class UnknownStudent
{
public:
UnknownStudent(string tmpInfo)
{
info = tmpInfo ;
}
string GetErrInfo()
{
return info ;
}
private:
string info;
};
测试
int main()
{
Student* test = StudentFactory::produceStudent("UnderGraduate");
if(test == nullptr) return -1;
test->Say();
// cout<<typeid(test).name()<<endl;
return 0;
}
输出:
学校培养 本科生
我是本科生......很高兴得到聘用