您的位置:首页 > 其它

设计模式-创建型02-工厂方法

2013-12-30 22:35 736 查看
一,动机

针对前面的简单工厂,虽然能比较方便的创建对象,但是,它对拓展很不方便。假如要增加一个新的产品则必须修改工厂的方法,这不符合“开闭原则”.于是,工厂方法模式应运而生,

二,定义

工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,将产品的实例化延迟到工厂子类中。这样的话,添加一个新的产品,只需要添加一个新的工厂和一个新的产品类即可。

三,模式结构





1.Factory 抽象的父工厂

负责定义工厂的公共接口

2.Concrete[b]Factory 具体子工厂[/b]

负责各子产品的具体实现

3.Product 抽象产品角色

工厂所创建的所有对象的父类

4.ConcreteProduct 具体产品角色

工厂的创建目标

四,代码实例

#include <iostream>
using namespace std;

class Student
{
public:
virtual void Say()=0;
};
class School
{
public:
virtual Student* produceStudent() = 0;

};

class UnderGraduate: public Student
{
public:
void Say()
{
cout<<"我是本科生......很高兴得到聘用"<<endl ;
}
};

class PostGraduate: public Student
{
public:
void Say()
{
cout<<"我是研究生......初次见面,多多关照"<<endl ;
}
};

class UnderGraduateSchool : public School
{
UnderGraduate* produceStudent()
{
cout<<"这里是本科生学校"<<endl;
return new UnderGraduate();
}
};

class PostGraduateSchool : public School
{
PostGraduate* produceStudent()
{
cout<<"这里是研究生学校"<<endl;
return new PostGraduate();
}
};

int main()
{
School* sch = new PostGraduateSchool(); //假如是java的话,可以使用反射机制,就更加方便拓展了。
Student* st=sch->produceStudent();
st->Say();
return 0;
}


代码运行结果

这里是研究生学校
我是研究生......初次见面,多多关照


如果要拓展一个博士生产品的话,只需要增加一个博士工厂,继承学校工厂,和一个博士生类即可。不必要修改之前的代码。这就是对修改关闭,对拓展开放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: