关于设计模式的作用:
“帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。”
具体可参考:https://www.cnblogs.com/linkstar/p/7859980.html
由于Caffe中的solver产生一系列的solver子类以及建立一系列layer类时就用到了工厂模式(参考:https://blog.csdn.net/fangjin_kl/article/details/54019066)。所以这里首先介绍一下第一种设计模式-----工厂模式
参考博客:https://blog.csdn.net/wuzhekai1985/article/details/6660462
工厂模式有三种:
(1)简单工厂模式;
(2)工厂方法模式;
(3)抽象工厂模式;
1、简单工厂模式
这么描述:现在有一个工厂Factory类,专门生成核core,现在要生产两种产品core_A 和 core_B,代码如下:
enum CTYPE {COREA, COREB}; class SingleCore { public: virtual void Show() = 0; }; //单核A class SingleCoreA: public SingleCore { public: void Show() { cout<<"SingleCore A"<
当然这么做也有一个缺点:当Factory要生产一个新的产品时,就要修改factory类,然而这样就违背了开放封闭原则,即软件实体(类、函数、模块)不可修改,只能扩展;所以为了通过扩展来实现可以生产新的产品,引入了工厂方法模式;
2、工厂方法模式
这么来描述:通过类的继承来实现扩展功能,即从父类factory中派生出factory_A类专门用来生产core_A 产品 , 派生出favtory_B类从来生产core_B产品。这样子如果味蕾要生产新的产品时,只需要派生出新的工厂子类就行了。代码如下:
class SingleCore { public: virtual void Show() = 0; }; //单核A class SingleCoreA: public SingleCore { public: void Show() { cout<<"SingleCore A"<
当然上面这么做也有一个缺点,就是每生产一种新的类别时就需要建立一个新的工厂,那么就存在这样一种情况,依然core_A类,可能我们要对A生产一系列产品,比如单核的A和多核的A,如果还是用工厂方法模式就太繁琐了,所以引入了抽象工厂模式;
3、抽象工厂模式
这么描述:它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,就是说父类factory只指定要生产单核类和多核类,而不需要指定A、B、C类等等。
代码如下:
//单核 class SingleCore { public: virtual void Show() = 0; }; class SingleCoreA: public SingleCore { public: void Show() { cout<<"Single Core A"<