设计模式学习--工厂方法模式

来源:互联网 发布:如何解除公司网络限制 编辑:程序博客网 时间:2024/06/11 01:27

  工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到了其子类。


  之前的简单工厂模式虽说也非常好,但是在添加和更改生产选项的时候,不得不更改switch和case语句,这点违背了设计模式的开方--封闭的原则。

  工厂方法模式,既克服了简单工厂违背开方--封闭原则的缺点,又保持了封装对象创建过程的优点。

  两种模式都是集中封装了对象的创建,使得要更换对象时,不需要做出大的改动就可以实现,降低了客户程序和产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的有点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。


#include <iostream>#include <string>using namespace std;class LeiFeng//雷锋类{public:void Sweep()//扫地{cout<<"扫地"<<endl;}void Wash()//洗衣{cout<<"洗衣"<<endl;}void Cook()//煮饭{cout<<"煮饭"<<endl;}};class Undergraduate : public LeiFeng//大学生类 继承于雷锋类 {};class Volunteer : public LeiFeng//志愿者类 继承于雷锋类{};/* class SimpleFactory//简单工厂方法{LeiFeng* leifeng;public:LeiFeng* createLeifeng(string type){if(type == "学雷锋的大学生"){leifeng = new Undergraduate;}else if(type == "社区志愿者"){leifeng = new Volunteer;}return leifeng;}}; */class Factory//工厂方法  工厂基类 {public:virtual LeiFeng* createLeifeng(){}//创建雷锋实例的虚函数};class UndergraduateFactory : public Factory//大学生雷锋 工厂类{public:LeiFeng* createLeifeng()//创建大学生雷锋{return (new Undergraduate);}};class VolunteerFactory : public Factory//志愿者雷锋 工厂类{public:LeiFeng* createLeifeng()//创建志愿者雷锋{return (new Volunteer);}};int main(){/* SimpleFactory S;LeiFeng* student1 = S.createLeifeng("学雷锋的大学生");student1->Sweep();LeiFeng* student2 = S.createLeifeng("学雷锋的大学生");student2->Wash();LeiFeng* student3 = S.createLeifeng("学雷锋的大学生");student3->Cook(); */Factory* factory = new UndergraduateFactory;//工厂基类指针  指向  大学生雷锋工厂类LeiFeng* student1 = factory->createLeifeng();//工厂基类指针  访问  大学生雷锋工厂类  createLeifeng函数LeiFeng* student2 = factory->createLeifeng();//工厂基类指针  访问  大学生雷锋工厂类  createLeifeng函数LeiFeng* student3 = factory->createLeifeng();//工厂基类指针  访问  大学生雷锋工厂类  createLeifeng函数student1->Sweep();//大学生雷锋类对象 访问 雷锋类函数student2->Wash();//大学生雷锋类对象 访问 雷锋类函数student3->Cook();//大学生雷锋类对象 访问 雷锋类函数return 0;}


0 0
原创粉丝点击