Tsai笔记:C++设计模式学习(4)—— 工厂方法模式(Factory Method)
设计模式的系列笔记链接如下:
Tsai笔记:C++设计模式学习(1)—— 设计模式介绍及分类
Tsai笔记:C++设计模式学习(2)—— 单例模式(Singleton)
Tsai笔记:C++设计模式学习(3)—— 享元模式(Flyweight)
Tsai笔记:C++设计模式学习(4)—— 工厂模式方法(Factory Method)
Tsai笔记:C++设计模式学习(5)—— 抽象工厂模式(Abstract Factory)
一、模式定义
享元模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 ——《设计模式》Gof
二、要点总结
- Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
- Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
- Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。
三、C++ 代码呈现
#include<iostream>
//抽象类(接口)
class ISplitter {
public:
virtual ~ISplitter() {}
virtual void split() = 0;
};
//具体类实现
class BinarySplitter : public ISplitter {
public:
void split(){
std::cout << " --- BinarySplitter Work !" << std::endl;
}
};
class TxtSplitter : public ISplitter {
public:
void split() {
std::cout << " --- TxtSplitter Work !" << std::endl;
}
};
class PictureSplitter : public ISplitter {
public:
void split() {
std::cout << " --- PictureSplitter Work !" << std::endl;
}
};
class VideoSplitter : public ISplitter {
public:
void split() {
std::cout << " --- VideoSplitter Work !" << std::endl;
}
};
//工厂基类
class SplitterFactory {
public:
virtual ~SplitterFactory() {}
virtual ISplitter* CreateSplitter() = 0;
};
//具体工厂类
class BinarySplitterFactory : public SplitterFactory {
public:
ISplitter* CreateSplitter() {
return new BinarySplitter;
}
};
class TxtSplitterFactory : public SplitterFactory {
public:
ISplitter* CreateSplitter() {
return new TxtSplitter();
}
};
class PictureSplitterFactory : public SplitterFactory {
public:
ISplitter* CreateSplitter() {
return new PictureSplitter();
}
};
class VideoSplitterFactory : public SplitterFactory {
public:
ISplitter* CreateSplitter() {
return new VideoSplitter();
}
};
class MainForm{
SplitterFactory* factory;//工厂
public:
MainForm(SplitterFactory* factory) {
this->factory = factory;
}
void Work() {
ISplitter * splitter = factory->CreateSplitter(); //多态new
splitter->split();
}
};
测试函数:
#include <Factory.h>
int main()
{
BinarySplitterFactory binary;
TxtSplitterFactory txt;
PictureSplitterFactory picture;
VideoSplitterFactory video;
MainForm Splitter_b(&binary);
Splitter_b.Work();
MainForm Splitter_t(&txt);
Splitter_t.Work();
MainForm Splitter_p(&picture);
Splitter_p.Work();
MainForm Splitter_v(&video);
Splitter_v.Work();
return 0;
}
输出结果为:
--- BinarySplitter Work !
--- TxtSplitter Work !
--- PictureSplitter Work !
--- VideoSplitter Work !