工厂模式和抽象工厂模式的区别_工厂模式代码

工厂模式和抽象工厂模式的区别_工厂模式代码工厂模式 Factory Method动机模式定义实例结构图要点总结笔记动机在软件系统中,经常面临着创建对象的工作,由于需求的变换,需要创建的对象的具体类型经常变换。如何应对这种变换?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”具体对象创建工作“的紧耦合模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类实例朴素class ISplitter{public:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

工厂模式 Factory Method

动机

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

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

模式定义

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

实例

朴素

class ISplitter{ 
   
public:
    virtual void split() = 0;
    virtual void ~ISplitter(){ 
   }
}
class FileSpliter : ISplitter{ 
   
    void split(){ 
   
        for(int i = 0;i < m_fileNumber;i ++){ 
   
            //..
            if(m_progressBar != nullptr){ 
   
                m_progressBar->setValue((i + 1) / m_fileNumber);
            }
        }
    }
}

class TxtSpliter : public ISplitter{ 
   

};

class BinarySplitter : public ISplitter{ 
   

};
class MainForm : public Form{ 
   
    TextBox * txtFilaPath;
    TextBox * txtFileNumber;

    ProgressBar *progressBar;
public :
    void Button_Click(){ 
   
        string filePath = txtFilaPath->getText();
        int number = atoi(txtFileNumber->getText());

        ISplitter *splitter =       //抽象依赖
            new BinarySplitter(filePath,number);    //具体依赖

        splitter.split();
    }
}

工厂模型

class MainForm : public Form{ 
   
    TextBox * txtFilaPath;
    TextBox * txtFileNumber;

    ProgressBar *progressBar;

    SplitterFactory * factory;//工厂
public :
    MainForm(SplitterFactory *factory){ 
   
        this->factory = factory;
    }
    void Button_Click(){ 
   
        string filePath = txtFilaPath->getText();
        int number = atoi(txtFileNumber->getText());

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

        splitter.split();
    }
}
//工厂基类
class SplitterFactory{ 
   
    public:
    virtual ISplitter* CreateSplitter() = 0;
    ~SplitterFactory(){ 
   };
}
//抽象类
class ISplitter{ 
   
public:
    virtual void split() = 0;
    virtual void ~ISplitter(){ 
   }
}

//具体类
class FileSpliter : ISplitter{ 
   
    
}

class TxtSpliter : public ISplitter{ 
   

};

class BinarySplitter : public ISplitter{ 
   

};

//具体工厂
BinarySplitterFactory : public SplitterFactory{ 
   
public :
    virtual ISplitter *CreateSplitter(){ 
   
        return new BinarySplitter()
    }
}

结构图

在这里插入图片描述

要点总结

  • Factory Method 模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变换的具体类型,紧耦合关系(new)会导致软件的脆肉
  • Factory Method模式通过面向对象的手法(多态),将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了这种紧耦合关系
  • Factory Method模式解决”单个对象“的需求变化。缺点在于要求创建方法/参数相同

笔记

  • 面向接口编程告诉我们 一个类的类型应该声明称接口 不应该声明称具体的类
  • 编译时依赖:编译的时候必须得确定好类型
  • new 带来了细节依赖 接口是抽象依赖
  • 并不能把依赖具体类消灭掉 实际上是把他们赶到一个局部的地方
  • 扩展就是不需要直接对着源代码换一个类就更改一下源代码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168511.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 服务器端黑盒测试工具JMeter[通俗易懂]

    服务器端黑盒测试工具JMeter[通俗易懂]简介JMeter是针对服务器的黑盒测试工具。可以用于功能测试,负载测试和性能测试。JMeter是ApacheJakarta的子项目,开源免费软件。JMeter的网址:jakarta.apache.org/jmeter/当前版本:2.3安装和使用需要安装JRE。解压缩JMeter的分发包。在bin目录下,运行jmeter.bat。在JMeter窗口中定义测试…

    2022年8月31日
    0
  • MyBatis面试题总结「建议收藏」

    MyBatis面试题总结「建议收藏」啃下MyBatis源码-MyBatis面试题总结1.概念/使用方法向的问题1.1什么是Mybatis?1.2为什么说Mybatis是半ORM框架?/与Hibernate有哪些不同?1.3Mybaits的优点?1.4MyBatis框架的缺点?1.5#{}和${}的区别?1.6怎么解决实体类中的属性名和表中的字段名不一样的问题?1.7在mapper中如何传递多个参数?…

    2022年6月11日
    23
  • Pycharm连接mysql数据库报错1130,1054「建议收藏」

    Pycharm连接mysql数据库报错1130,1054「建议收藏」Pycharm连接mysql报错1130,1054

    2022年8月27日
    0
  • TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    2021年10月24日
    45
  • java中常量_Java中的常量有哪些?[通俗易懂]

    java中常量_Java中的常量有哪些?[通俗易懂]JAVA常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。那么java的常量有哪些呢?在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。下面我们就一起来看看java中的这些常量。1.整型常量整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式具体表示形式如下。二进制:由数字0和1组成的数字序列。在JDK7.0中允许使用字面…

    2022年7月8日
    21
  • 华三交换机配置access命令_H3C交换机配置基本命令详解

    华三交换机配置access命令_H3C交换机配置基本命令详解H3C交换机配置基本命令详解随着移动互联网趋势加快以及智能终端的快速普及,WLAN应用需求在全球保持高速增长态势。下面是小编整理的关于H3C交换机配置基本命令详解,希望大家认真阅读!1、配置主机名[H3C]systemnameH3C2、配置console口密码#进入系统视图。system-view#进入AUX用户界面视图。[H3C]user-interfaceaux0#设置通过Con…

    2022年6月20日
    197

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号