属于是对象创建模式的一种,这类模式的特点是:用虚函数运行时依赖的特点创建对象,绕开new,避免对象创建(new)过程的紧耦合。通常是接口抽象后的第一步工作。
定义一个用于创建对象的接口(侯捷课上说的,就是相当于重写一个支持多态的new方法)让子类决定实例化哪一个类。Factory_method就启到了一个让类的实例化延迟的作用。
就是有个虚函数 (参数就肯定相同了),用的时候根据传来的工厂判断要生产的是什么东西。
工厂模式有效的解决了添加新产品必须要修改工厂类代码的问题,新增一种武器只需要新增一个武器类型的工厂即可,符合开闭原则。
工厂模式的本质是将具体的创建工作放在了具体子类的工厂中进行
#pragma once //多态创建对象所需要的参数形式必须是相同的 //产品基类 templateclass base_weapon { public: virtual void describe() { } virtual ~base_weapon() {} }; //工厂基类 template class base_weapon_factory { public: virtual base_weapon * create() = 0;//这里的=0意思是纯虚函数,不然的话编译的时候会要求返回值不能为空 virtual ~base_weapon_factory() {} }; //concrete产品 template class concrete_weapon1 :public base_weapon { public: virtual void describe() { cout << "我是一把一类型武器" << endl; } }; template class concrete_weapon2 :public base_weapon { public: virtual void describe() { cout << "我是一把二类型武器" << endl; } }; //concrete工厂 template class weapon1_factory :public base_weapon_factory { public: virtual base_weapon * create() { return new concrete_weapon1 ; } }; template class weapon2_factory :public base_weapon_factory { public: virtual base_weapon * create() { return new concrete_weapon2 ; } }; //测试用的 template class Test_factory_use { public: base_weapon_factory * factory; Test_factory_use(base_weapon_factory * fac) :factory(fac) {}//这就要求外界要知道要传啥工厂进去 void Test_make_a_weapon() { base_weapon * unkown_weapon= factory->create(); unkown_weapon->describe(); } };
接口
//测试工厂模板方法 cout << "测试factory_method方法" << endl; weapon1_factory* Weapon1_factory1 = new weapon1_factory ;//这是要传进去的工厂 Test_factory_use * Test_factory = new Test_factory_use (Weapon1_factory1); Test_factory->Test_make_a_weapon();
http://dingxiaowei.cn/2017/05/14/参考



