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

来源:互联网 发布:ai软件免费下载 编辑:程序博客网 时间:2024/05/18 09:29

一,动机

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

输出:

学校培养 本科生我是本科生......很高兴得到聘用

0 0