设计模式-工厂方法模式(Factory Method)

来源:互联网 发布:网络在线英语培训 编辑:程序博客网 时间:2024/06/02 10:30

应用场景:

1.类不知道自己要创建哪一个对象
2.
类用它的子类来指定创建哪个对象
3.
客户需要清楚创建了哪一个对象

优点:

1、多态性:客户代码可以做到与特定应用无关,适用于任何实体类。

2、子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。-- 加一层间接性,增加了灵活性

3、连接并行的类层次结构。

4、良好的封装性,代码结构清晰。

5、扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”。

6、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。

7、典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。

 

缺点:

需要Creator和相应的子类作为factory method的载体,如果应用模型确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。

简单实现:

#include <string>

#include <iostream>

using namespace std;

//实例基类,相当于 Product(为了方便,没用抽象)

class LeiFeng

{

public:

virtual void Sweep()

{

cout<<"雷锋扫地"<<endl;

}

//学雷锋的大学生,相当于 ConcreteProduct

class Student: public LeiFeng

{

public:

virtual void Sweep()

{

cout<<"大学生扫地"<<endl;

}

//学雷锋的志愿者,相当于 ConcreteProduct

class Volenter: public LeiFeng

{

public :

virtual void Sweep()

{

cout<<"志愿者扫地"<<endl;

}

//工厂基类 Creator

class LeiFengFactory

{

public:

virtual LeiFeng* CreateLeiFeng()

{

return new LeiFeng();

}

};

//工厂具体类

class StudentFactory : public LeiFengFactory

{

public :

virtual LeiFeng* CreateLeiFeng()

{

return new Student();

}

};

class VolenterFactory : public LeiFengFactory

{

public:

virtual LeiFeng* CreateLeiFeng()

{

return new Volenter();

}

};

//客户端

int main()

{

LeiFengFactory *sf=new LeiFengFactory();

LeiFeng *s=sf->CreateLeiFeng();

s->Sweep();

delete s;

delete sf;

return 0;

}


0 0