【设计模式】Head First 设计模式——工厂方法模式 C++实现

这篇具有很好参考价值的文章主要介绍了【设计模式】Head First 设计模式——工厂方法模式 C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

设计思想

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。(目的:解耦,手段:虚函数)

动机

在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。

如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。

Factory Method模式通过面向对象的收发,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种耦合关系。

Factory Method 模式解决“单个对象”的需求变化。缺点在于创建方法、参数需要相同。

业务场景

在 MainForm 中需要对文件进行分解操作,但是分解的文件可能是二进制文件,文本文件,图片文件等等,这时候我们需要在 MainForm 创建对应的对象,然后调用分解函数。

一个非常直观的思路是:

class ISplitter {
public:
    virtual void split() = 0;
    virtual ~ISplitter() {
    }
};

class BinarySplitter : public ISplitter {
//实现分解二进制文件
};

class TxtSplitter : public ISplitter {
//实现分解TXT文件
};

class PictureSplitter : public ISplitter {
//实现分解图片文件
};

class VideoSplitter : public ISplitter {
 //实现分解视频文件   
};

class MainForm : public Form {
public:
    void Button1_Click() {
        ISplitter* splitter = new BinarySplitter();  
        splitter->split();
    }
};

这是很自然的一种写法,问题的关键在于这一句代码:

ISplitter* splitter = new BinarySplitter();  

在等号的左边,是一个抽象类,属于抽象依赖(编译时依赖),但是等号的右边,是一个具体类,属于细节依赖。根据依赖倒置原则,抽象不应该依赖于细节,而这种写法很明显违背了这种原则。

下面看看使用工厂模式应该怎么去实现:

代码案例

编写专门的工厂类,再编写具体的工厂子类。在具体操作的 MainForm 中通过构造把子类对象传入。用多态的方式,避免了 MainForm 中的固定。文章来源地址https://www.toymoban.com/news/detail-687580.html

// 抽象类
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();
    }
};

// MainForm 没有具体类的依赖
// 只有抽象的类的依赖
// 把依赖具体类转移了
class MainForm : public Form {
    SplitterFactory* factory;  // 含有工厂成员

public:
    MainForm(SplitterFactory* factory) {
        this->factory = factory;
    }//想要实例化什么样的对象,由运行时决定

    void Button1_Click() {
        ISplitter* splitter = factory->CreateSplitter();  // 多态new
        splitter->split();
    }
};

到了这里,关于【设计模式】Head First 设计模式——工厂方法模式 C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】Head First 设计模式——观察者模式 C++实现

    设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 主题对象(出版者)管理某些数据,当主题内的数据改变,就会通知观察者(订阅者)。

    2024年02月10日
    浏览(41)
  • 【Head First 设计模式】-- 观察者模式

    客户有一个WeatherData对象,负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求,让我们利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口: getTemperature():获取温度 getHumidity():获取湿度 getPressure():获

    2024年02月05日
    浏览(46)
  • [设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式

    前言: 为什么之前写过Golang 版的设计模式,还在重新写 Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很多人学习有做笔记的习惯,如果单纯的只是放一张图片,那

    2024年01月21日
    浏览(44)
  • 【C++设计模式】用简单工厂模式实现按汽车重量输出汽车类型

    2023年8月24日,周四凌晨  

    2024年02月11日
    浏览(52)
  • C++设计模式(工厂模式)

    本篇文章正式带大家来学习C++中的设计模式,这篇文章主要带大家学习工厂模式。 工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但将具体对象的实例化延迟到子类或具体工厂类中。工厂模式通过解耦客户端代码和创建具体对象的过程,使客

    2024年02月11日
    浏览(37)
  • 设计模式(二)、工厂模式--工厂方法模式

    工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构 它的核心结构有四个角色  抽象工厂;具体工厂;抽象产品;具体产品 抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定

    2024年02月16日
    浏览(38)
  • 【设计模式】单例模式、工厂方法模式、抽象工厂模式

    1. 单例模式 (Singleton Pattern): 场景: 在一个应用程序中,需要一个全局唯一的配置管理器,确保配置信息只有一个实例。 2. 工厂方法模式 (Factory Method Pattern): 场景: 创建一组具有相似功能但具体实现不同的日志记录器。 3. 抽象工厂模式 (Abstract Factory Pattern): 场景: 创建不同

    2024年01月15日
    浏览(61)
  • 【13】c++设计模式——>简单工厂模式

    c++中的工厂模式是一种创建型设计模式,它提供一种创建对象的接口,但具体创建的对象类型可以在运行时决定,这样可以将对象的创建与使用代码分离,提高代码的灵活性和可维护性。 在c++中实现工厂模式,通常会定义一个工厂类,该类负责创建对象。工厂类通常具有一个

    2024年02月07日
    浏览(35)
  • 【设计模式专题之工厂方法模式】2.积木工厂

    时间限制:1.000S  空间限制:256MB 题目描述 小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。 输入描述 输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。  接下来的 N 行,每行输入一

    2024年03月14日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包