您的位置:首页 > 其它

设计模式-创建型01-简单工厂

2013-12-29 21:29 274 查看
一,动机

假设有这么一个软件应用场景,一个软件系统可以提供多个外观不同的按钮,这些按钮源自于一个抽象按钮,子按钮在继承抽象按钮后做了相应的实现。如果我们在使用这些按钮时,不需要具体知道这些具体按钮的名字,只需要知道表示那个按钮的标识符,并提供一个调用方法即可。(熟悉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;
}


输出:

学校培养 本科生
我是本科生......很高兴得到聘用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐