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

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


相关推荐

  • Android Studio中使用Gradle打包

    Android Studio中使用Gradle打包

    2022年2月3日
    152
  • 风控模型及特征的上线部署方法

    风控模型及特征的上线部署方法序言:作为年后的首篇实操干货文章,番茄风控一如既往向业内小伙伴输出相关的干货文章。有实操能落地,有数据可撸码,继续将会是番茄风控提供给各位小伙伴的业内标配内容。近期,我们花费了时间容整理了目前业内各位小伙伴关心的内容,本次文章是其中一个问题就是模型跟规则在现有的风控系统内是如何规范上线的,基于此,我们给大家带来了这样的一篇内容。本次文章内容翔实,章节就有四大部分,内容绝对干货满满,实操性十足。老规矩,文章中提及的更详情(数据集+代码内容)可以直接到知识课堂中下载学习。本文有理论,有方法,有实操,还有数

    2022年5月4日
    72
  • 1、Java从入门到精通

    1、Java从入门到精通将自己学习的Java基础整理出来,方便复习和记忆~~一、Java的历史1、Java开发分成了3个方向JavaSE:主要用于桌面程序的开发,学习JavaEE和JavaME的基础JavaEE:主要用于网页程序的开发JavaME:主要用于嵌入式系统程序的开发2、JavaSE平台中的lib软件包Java.lang包——语言核心包java.util包——Jav…

    2022年7月8日
    23
  • free mobile sex java_Java 8中Stream API的这些奇技淫巧!你都Get到了吗?

    free mobile sex java_Java 8中Stream API的这些奇技淫巧!你都Get到了吗?原标题:Java8中StreamAPI的这些奇技淫巧!你都Get到了吗?作者:我是你的小眼睛儿链接:https://www.jianshu.com/p/9fe8632d0bc2Stream简介1、Java8引入了全新的StreamAPI。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。2、stream是对集合对象功能的增强,它专注于对集合对象…

    2022年10月15日
    2
  • python 文档注释快捷键,python注释快捷键是什么「建议收藏」

    python 文档注释快捷键,python注释快捷键是什么「建议收藏」python注释快捷键:1、单行注释是【#】,Mac的快捷键是【command+/】,windows的快捷键是【Ctrl+/】;2、多行注释是三个单引号【”’注释”’】。g1m少儿编程网-https://www.pxcodes.comg1m少儿编程网-https://www.pxcodes.com本教程操作环境:windows7系统、python3.9版,DELLG3电脑。g1m少儿编程…

    2022年5月12日
    57
  • flash人物原地走路,Flash制作小人走路简单动画图文教程「建议收藏」

    flash人物原地走路,Flash制作小人走路简单动画图文教程「建议收藏」很多用户都想掌握Flash中的各种制作动画的技巧,今天极限下载小编就为大家分享如何利用Flash制作小人移动的动画,是对形状补间的一次简单运用,值得一说的是形状补间做的小人比起动画补间来说要轻松简明不少,而且动作多变,不过易出现问题,用flash制作小人走路的简单动画,一起来看看吧!工具/原料flashCS3FLASH基础方法/步骤1、首先利用椭圆工具和刷子工具在舞台上画一个小人,形状自己定,反正…

    2022年4月29日
    397

发表回复

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

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