本文已参与「新人创作礼」活动,一起开启掘金创作之路。
原文链接:blog.csdn.net/roufoo/arti…
这周学习了几种设计模式,发现4种设计模式
Factory Method
Abstract Factory
Protytype
Builder
其实是很相似的。它们都是定义一个用于创建对象的接口,让子类来决定实例化哪一个类,从而使得一个类的实例化延迟,这样,就可以避免new过程中所导致的依赖具体类的紧耦合。
首先来看Factory Method设计模式,GOF里面的原话是: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
翻译成中文就是“定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。”。
结构图如下:
上面的Creator就是抽象工厂, ConcreteCreator就是具体工厂。Product是抽象产品,它定义了工厂方法创建的对象的接口。ConcreteProduct是具体产品,它实现了Product接口。
说简单一点就是:抽象工厂是与客户端的接口,这样客户就不需要知道具体工厂的细节。具体工厂负责生产具体产品,里面就负责具体产品的业务逻辑怎么实现。抽象产品是具体产品的父类或实现的接口。
打个比方:苹果公司是一个抽象工厂,我们必须要制定具体的工厂才能生成具体的产品,象IPhone6, IPhone6S, IPhone7 每一个就是一个具体产品,其对应一个具体工厂。
一个按工厂方法设计模式的文件分割器的伪代码实现如下。它模拟了二进制分割,文本分割,图像分割和视频分割等不同业务的实现。
//抽象类
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
//工厂基类
class SplitterFactory{
public:
virtual ISplitter* CreateSplitter()=0;
virtual ~SplitterFactory(){}
};
//具体类
class BinarySplitter : public ISplitter{
};
class TxtSplitter: public ISplitter{
};
class PictureSplitter: public ISplitter{
};
class VideoSplitter: public ISplitter{
};
//具体工厂
class BinarySplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new BinarySplitter();
}
};
class TxtSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new TxtSplitter();
}
};
class PictureSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new PictureSplitter();
}
};
class VideoSplitterFactory: public SplitterFactory{
public:
virtual ISplitter* CreateSplitter(){
return new VideoSplitter();
}
};
class MainForm
{
SplitterFactory* factory;//工厂
public:
MainForm(SplitterFactory* factory){
this->factory=factory;
}
void Button1_Click(){
ISplitter * splitter=
factory->CreateSplitter(); //多态new
splitter->split();
}
};
上面的代码中,每种业务都有一个具体类/具体工厂。在MainFrame中,其具体工厂的参数会引入,这样,当用户点击button时就会生成相应的产品。这样做的好处就是MainFrame里面再也不需要根据具体的产品来调用一堆if…else代码,非常简洁。