工厂模式

动机
- 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
- 判断有没有需求的变化
定义
- 定义一个用于创建对象的接口,让子类决定实例化哪个类。
- Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。
- 假设一个客户需要使用一个产品里的接口,也就是客户需要一个产品的对象的时候,若是正常new的话,就需要依赖一个具体类了(编译时依赖),所以此时我们设计一个工厂,客户使用工厂产生的产品的接口,而不需要当场写出使用哪种具体的产品(动态多态),工厂根据运行时传入的参数来提供产品
- 例,学生做作业,需要使用笔(抽象类)的写字这个接口,但是我们不希望在编写的时候就决定用什么颜色的笔,而是根据具体情况使用不同颜色的笔
class Pen {
public:
virtual void Write() = 0;
virtual ~Pen() {}
};
class BlackPen : public Pen {
public:
virtual void Write() {
cout << "蓝色的字" << endl;
}
virtual ~BlackPen() {}
};
class RedPen : public Pen {
public:
virtual void Write() {
cout << "红色的字" << endl;
}
virtual ~RedPen() {}
};
class PenFactory {
public:
virtual Pen* ProductPen() = 0;
virtual ~PenFactory() {}
};
class BlackPenFactory : public PenFactory {
public:
virtual Pen* ProductPen() {
return new BlackPen;
}
virtual ~BlackPenFactory() {}
};
class RedPenFactory : public PenFactory {
public:
virtual Pen* ProductPen() {
return new RedPen;
}
virtual ~RedPenFactory() {}
};
class DoHomework {
protected:
PenFactory* penFactory;
public:
DoHomework(PenFactory* penFactory) : penFactory(penFactory) {}
void doHomework() {
Pen* pen = penFactory->ProductPen();
cout << "写作业 ";
pen->Write();
delete pen;
}
~DoHomework() {
}
};
int main()
{
RedPenFactory* red = new RedPenFactory;
DoHomework* doHomework = new DoHomework(red);
doHomework->doHomework();
delete red;
delete doHomework;
}
- Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
- Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
- Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。