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