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

来源:互联网 发布:软件编程软件 编辑:程序博客网 时间:2024/06/05 17:00

这周学习了几种设计模式,发现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();    }};{    SplitterFactory*  factory;//工厂public:    MainForm(SplitterFactory*  factory){        this->factory=factory;    }    void Button1_Click(){        ISplitter * splitter=            factory->CreateSplitter(); //多态new        splitter->split();    }};

上面的代码中,每种业务都有一个具体类/具体工厂。在MainFrame中,其具体工厂的参数会引入,这样,当用户点击button时就会生成相应的产品。这样做的好处就是MainFrame里面再也不需要根据具体的产品来调用一堆if…else代码,非常简洁。

0 0
原创粉丝点击