您的位置:首页 > 编程语言 > C语言/C++

C++ 工厂方法设计模式的学习 (Boolan学习笔记第12周)

2017-04-12 14:26 507 查看
这周学习了几种设计模式,发现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* CreateSplit
4000
ter(){
return new VideoSplitter();
}
};

{
SplitterFactory*  factory;//工厂

public:

MainForm(SplitterFactory*  factory){
this->factory=factory;
}

void Button1_Click(){

ISplitter * splitter=
factory->CreateSplitter(); //多态new

splitter->split();

}
};


上面的代码中,每种业务都有一个具体类/具体工厂。在MainFrame中,其具体工厂的参数会引入,这样,当用户点击button时就会生成相应的产品。这样做的好处就是MainFrame里面再也不需要根据具体的产品来调用一堆if…else代码,非常简洁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 设计模式