//工厂模式
#include "stdafx.h"
#include <string>
#include<iostream>
using namespace std;
class Product
{
public:
virtual void use(){};
};
class ConcreteProductA :public Product
{
public:
void use()
{
cout << "使用A" << endl;
};
};
class ConcreteProductB:public Product
{
public:
void use()
{
cout << "使用B" << endl;
};
};
class Factory
{
public:
Product* Factory::createProduct(string proname){
if ("A" == proname)
{
return new ConcreteProductA();
}
else if ("B" == proname)
{
return new ConcreteProductB();
}
return NULL;
}
};
int main()
{
Product *P = NULL;
Product *Q = NULL;
Factory f;
P=f.createProduct("A");
Q = f.createProduct("B");
P->use();
Q->use();
return 0;
}
这个是最简单的工厂模式。
Layer_factory的主要作用是负责Layer的注册,已经注册完事的Layer在运行时可以通过传递一个 LayerParameter 给 CreaterLayer 函数的方式来调用:
LayerRegistry::CreateLayer(param);//可以参考net.cpp 中的调用方法
假设有一个如下的Layer:
template <typename Dtype>
class MyAwesomeLayer : public Layer<Dtype> {
// your implementations
};
它的type就是C++类名,除去后缀”Layer”:
(“MyAwesomeLayer” -> “MyAwesome”).
我们可以通过以下两种方式来注册一个Layer:
只有一个构造函数
如果这个Layer只能通过它的构造函数来创建的话,在对应的C++文件里面加入以下行就行:
REGISTER_LAYER_CLASS(MyAwesome);
有可选的构造函数
如果这个Layer还可以通过另外一个如下形式的构造函数构造:
template <typename Dtype>
Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) {
// your implementation
}
具体可以参考GetConvolutionLayer,Layer_factory.cpp。
这种情况下,我们可以通过注册构造函数的方式来进行Layer的注册:
REGISTER_LAYER_CREATOR(MyAwesome, GetMyAwesomeLayer)
以上是layer_factory要做的事情。
本人比较懒,看看黄晓东的一个EUCLIDEAN LOSS Layer描述,我就直接搬砖放到一部分了。
,工厂模式是为了弥补面向对象型编译语言的不足,会被OO的多态所需要。
以Caffe为例:
我们当前有一个基类指针Layer* layer;
在程序运行之前,计算机并不知道这个指针究竟要指向何种派生类。是卷积层?Pooling层?ReLU层?
鬼才知道。一个愚蠢的方法:
if(type==CONV) {....} else if(type==POOLING) {....} else if(type==RELU} {.....} else {ERROR}
看起来,还是可以接受的,但是在软件工程专业看来,这种模式相当得蠢。
工厂模式借鉴了工厂管理产品的经验,将各种类型存在数据库中,需要时,拿出来看看。
这种模式相当得灵活,当然,在Caffe中作用不是很大,仅仅是为了花式好看。