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

工厂模式和抽象工厂模式的区别_工厂模式代码工厂模式 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一:计算机基础入门及介绍[通俗易懂]

    一:计算机基础入门及介绍[通俗易懂]一:计算机基础入门篇1.计算机系统计算机(Conputer):俗称电脑,一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速的处理,然后把处理结果输出的现代化智能电子设备。…

    2022年10月21日
    3
  • struts2 拦截器和过滤器理解

    struts2 拦截器和过滤器理解学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下。          过滤器,是在javaweb中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do

    2022年10月6日
    2
  • phpstorm激活码2021年4月_通用破解码

    phpstorm激活码2021年4月_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    93
  • 什么是Volatile关键字?

    什么是Volatile关键字?一、Java的内存模型(JMM)在仔细讲解Java的volatile关键字之前有必要先了解一下【Java的内存模型】Java的内存模型简称JMM(JavaMemoryModel),是Java虚拟机所定义的一种抽象规范用来屏蔽【不同硬件】和【操作系统】的【内存访问差异】。让Java程序在各种平台下都能达到一致的内存访问效果。…

    2022年7月27日
    5
  • Zookeeper安装_docker vmware

    Zookeeper安装_docker vmware百度网盘链接提取码:yg12拷贝zoo.cfg更改日志输出路径新建文件夹启动成功

    2022年8月8日
    4
  • linux dlopen 相关

    linux dlopen 相关dlopen 3 Linux 手册页名称 dladdr dlclose dlerror dlopen dlsym dlvsym 动态链接加载器的编程接口概要 include lt nbsp dlfcn h nbsp gt void dlopen constchar nbsp filename nbsp int nbsp flag nbsp char dlerror void void dls

    2025年6月14日
    2

发表回复

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

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