与抽象工厂的区别:抽象工厂的抽象类组合的是创建一个系列对象的接口。而工厂方法只有一个接口,各个具体类实现该接口的方式不一样。
1. 意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
2. 结构与参与者
3.效果
1)为子类提供挂钩(hook)
还没有搞懂
2)连接平行的类层次
4.实现
1)主要有两种不同的情况
1.Creator是一个抽象类并且不提供它所声明的工厂方法的实现。
2.Creator是一个具体的类而且为工厂方法提供一个缺省的实现。
2)参数化工厂方法
就是将简单工厂的switch语句从客户端移入Creator类中,起到了封装的作用。
5.代码示例
#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();
StudentFactory *stf=new StudentFactory();
LeiFeng *st=stf->CreateLeiFeng();
st->Sweep();
return 0;
}