【编程基础心法】「创建模式系列」让我们一起来学编程界的“兵法”设计模式(工厂模式)

【编程基础心法】「创建模式系列」让我们一起来学编程界的“兵法”设计模式(工厂模式)

  • 设计模式之间的千丝万缕
  • 工厂模式
    • 简单工厂方法
      • 简单工厂定义
      • 多方法模式
      • 多个静态方法模式
      • 简单工厂模式的问题
    • 工厂方法模式
      • 定义工厂抽象接口
      • 工厂方法存在的问题
    • 抽象工厂模式
      • 实现抽象工厂类接口
      • 定义对应的产品对象类
      • 分析抽象工厂和工厂模式的区别
        • 工厂方法模式
        • 抽象工厂模式
        • 区别
  • 总结

设计模式之间的千丝万缕

从这一块开始,我们详细介绍 Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析。

下面是关于设计模式之间的一个千丝万缕的关系,就如同网状结构一样,他们之间相辅相成互相依赖着。
在这里插入图片描述
接下来让我们来进行给大家介绍和展开我们的第一个部分的内容工厂模式。

工厂模式

工厂模式是一种常用的设计模式,它可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在Java中,工厂模式有多种实现方式,本文将介绍其中的三种常见实现方式。

简单工厂方法

简单工厂模式是工厂模式的最基本形式,它通过一个工厂类来创建对象。而简单工厂一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂。
在这里插入图片描述
在Java中,我们可以通过一个静态方法来实现简单工厂模式。下面是一个简单工厂模式的示例代码:

简单工厂定义

首先我们先定义一个接口Product,作为我们的产品模型。

public interface Product {
    void use();
}

接下来我们定义一下对应的实现类,作为不同产品的一个实现实体,方便我们用工厂方法去调用进行构建。

public class ProductA implements Product {
    @Override
    public void use() {
        System.out.println("Product A is used.");
    }
}
public class ProductB implements Product {
    @Override
    public void use() {
        System.out.println("Product B is used.");
    }
}

接下来我们定一下关于对应的工厂方法,这个工厂方法作为构建对象的一个工厂类。

public class SimpleFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ProductA();
        } else if (type.equals("B")) {
            return new ProductB();
        } else {
            return null;
        }
    }
}

在上面的代码中,我们定义了一个简单工厂类SimpleFactory,它有一个静态方法createProduct,根据传入的参数type来创建不同的产品对象。我们还定义了一个Product接口和两个实现类ProductA和ProductB,它们都实现了Product接口。

例如:当我们传递A的时候和传递B的时候,构建了是不同的对象。

多方法模式

是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确
创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
在这里插入图片描述
实现代码如下:

public class SimpleFactory {
    public Product createProductA() {
         return new ProductA();
    }
    public Product createProductB() {
         return new ProductB();
    }
}

多个静态方法模式

静态方法的模式和多方法模式很像,只是单纯的将方法的类型换成静态方法进行修饰。

public class SimpleFactory {
    public static Product createProductA() {
         return new ProductA();
    }
    public static Product createProductB() {
         return new ProductB();
    }
}

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

简单工厂模式的问题

使用简单工厂模式的好处是可以将对象的创建和使用分离,客户端只需要知道如何使用产品对象,而不需要知道如何创建产品对象。

但是,简单工厂模式的缺点是如果需要添加新的产品类型,就需要修改工厂类的代码,违反了开闭原则,由此,我们诞生了一种升级版的简单工厂模式,我们定义为工厂模式。


工厂方法模式

工厂方法模式是对简单工厂模式的改进,它将工厂类抽象成一个接口,每个具体的产品类都有一个对应的工厂类来创建它。
在这里插入图片描述

下面是一个工厂方法模式的示例代码:

定义工厂抽象接口

首先我们定义了一个抽象的工厂接口类。

public interface Factory {
    Product createProduct();
}

随后我们又实现了这个工厂接口类。我们分别对产品A和产品B进行定义和实现工厂接口类的功能,如下所示:

public class ProductAFactory implements Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}
public class ProductBFactory implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

在上面的代码中,我们定义了一个工厂接口Factory和两个具体的工厂类ProductAFactory和ProductBFactory,它们都实现了Factory接口,分别用来创建ProductA和ProductB对象。我们还定义了一个Product接口和两个实现类ProductA和ProductB,它们都实现了Product接口。

工厂方法存在的问题

使用工厂方法模式的好处是可以将对象的创建和使用分离,每个产品类都有一个对应的工厂类来创建它,可以很方便地添加新的产品类型。但是,工厂方法模式的缺点是需要为每个产品类型都创建一个对应的工厂类,增加了代码量,由此我们又生成了一个更加高级的工厂模式,我们称之为抽象工厂模式。


抽象工厂模式

抽象工厂模式是对工厂方法模式的进一步改进,它将一组相关的产品对象组成一个工厂类,可以创建多个产品对象。下面是一个抽象工厂模式的示例代码:


public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

首先我们先定义了一个超像的工厂首先我们先定义了一个抽象的工厂方法,那么这个抽象的工厂方法里面定义了分别创建产品A和产品B的方法。

实现抽象工厂类接口

public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

为了体现抽象工厂方法的优势,我们定义了四个产品的对象类。

定义对应的产品对象类

下面我们定义了四个产品的对象。。

public class ConcreteProductA1 implements ProductA {
    @Override
    public void use() {
        System.out.println("Concrete Product A1 is used.");
    }
}

public class ConcreteProductA2 implements ProductA {
    @Override
    public void use() {
        System.out.println("Concrete Product A2 is used.");
    }
}

public class ConcreteProductB1 implements ProductB {
    @Override
    public void use() {
        System.out.println("Concrete Product B1 is used.");
    }
}

public class ConcreteProductB2 implements ProductB {
    @Override
    public void use() {
        System.out.println("Concrete Product B2 is used.");
    }
}

在上面的代码中,我们定义了一个抽象工厂接口AbstractFactory和两个具体的工厂类ConcreteFactory1和ConcreteFactory2,它们都实现了AbstractFactory接口,分别用来创建一组相关的产品对象。我们还定义了两个产品接口ProductA和ProductB,以及四个具体的产品类ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2,它们都实现了对应的产品接口。

使用抽象工厂模式的好处是可以创建一组相关的产品对象,可以很方便地添加新的产品类型和工厂类。但是,抽象工厂模式的缺点是需要为每个产品类型都创建一个对应的产品接口和具体的产品类,增加了代码量。


分析抽象工厂和工厂模式的区别

工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:

工厂方法模式
  • 具有单个抽象产品类,可以派生出多个具体产品类。
  • 具有单个抽象工厂类,可以派生出多个具体工厂类。
  • 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式
  • 具有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
  • 具有单个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。

区别

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

工厂方法创建 “一种” 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。

总结

工厂模式是一种常用的设计模式,可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在Java中,工厂模式有多种实现方式,包括简单工厂模式、工厂方法模式和抽象工厂模式。选择哪种实现方式取决于具体的需求和场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中字符串列表的相互转换详解

更多资料获取 📚 个人网站:ipengtao.com 在Python编程中,经常会遇到需要将字符串列表相互转换的情况。这涉及到将逗号分隔的字符串转换为列表,或者将列表中的元素连接成一个字符串。本文将深入讨论这些情景,并提供丰富…

高防CDN可以更好的防御网站被攻击

高防CDN是在原服务器的基础上配置了DDoS高防、 CC防护、CDN加速来确保线上业务安全快速地运行。使用高防CDN后网站服务器会被隐藏在后端,使攻击者无法攻击到网站服务器,只能攻击部署在前端的CDN节点,每当检测到是攻击流量的时候还会自动对其进…

对比分析:黑盒测试 VS 白盒测试

一、引言 在软件开发过程中,测试是确保产品质量的关键环节。其中,黑盒测试和白盒测试是两种常见的测试方法。本文将详细解析这两种测试方法的定义、特点,同时通过具体示例进行对比分析。 二、黑盒测试 黑盒测试,又称功能测试&…

SpaceSight、Echo 联合升级,打造更懂场景的 AI 「超级门店」

当各领域都在谈论「增长」,门店业务的增长又该从哪里开始着手…… 在日常运营中,「高效」和「细致」是否无法同时实现?「任务下达」和「任务执行」之间有多大偏差? 在客户洞察上,如何用「过去」的数据预测「未来」&…

Spring Cloud Stream 4.0.4 rabbitmq 发送消息多function

使用 idea 创建 Springboot 项目 添加 Spring cloud stream 和 rabbitmq 依赖 pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

力扣100 相同的数(两种解法)

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&…

一键抠图|3个智能AI抠图软件实现抠图自由!

听说你对如何利用AI抠图技术去除白色背景感兴趣&#xff1f;设想一下&#xff0c;你有一张某人站在白色背景前的照片&#xff0c;而你只希望能留下这个人物。在过去&#xff0c;你可能需要花费大量时间和精力手动进行抠图。但现在&#xff0c;AI技术来拯救你了&#xff01;AI可…

180天Java从入门到就业-Day04-01Java程序流程控制介绍、Java分支结构if语句

1.程序流程控制介绍 1.1 流程控制结构介绍 流程控制语句是用来控制程序中各语句执行顺序的语句,可以将语句组合成完成一定功能的逻辑模块。 一个程序会包含三种流程控制结构:顺序结构、分支结构、循环结构 顺序结构在没有使用程序流程控制语句(if-else语句、switch-case语…

【JS】检索树结构,并返回结果节点的路径与子节点

【JS】检索树结构&#xff0c;并返回结果节点的路径与子节点 需求代码效果展示 需求 一个树结构&#xff0c;需要添加条件检索功能&#xff0c;检索结果依然是一个树结构&#xff0c;包含所有的符合要求的节点&#xff0c;以及他们到根节点的路径&#xff0c;与他们的子节点 …

社区分享|简米Ping++基于MeterSphere开展异地测试协作

上海简米网络科技有限公司&#xff08;以下简称为“简米”&#xff09;是国内开放银行服务商&#xff0c;高新技术企业&#xff0c;中国支付清算协会会员单位。自2014年成立至今&#xff0c;简米长年聚焦金融科技领域&#xff0c;通过与银行、清算组织等金融机构合作&#xff0…

知识小课堂:在光伏电站中发生绝缘阻抗异常的排查方法

【摘要】近几年&#xff0c;光伏发电技术迅猛发展&#xff0c;光伏扶贫电站及分布式光伏使光伏发电走进千家万户。然而光伏发电设备运行期间仍存在隐患。及时发现并解决*常见异常运行故障&#xff0c;可以很大地提高光伏发电设备可利用率&#xff0c;是保证光伏发电设备正常运行…

会声会影2024软件还包含了视频教学以及模板素材

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能&#xff0c;用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材&#xff0c;让用户剪辑视频更加的轻松。 会…

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…

有没有数字化转型服务提供商推荐?企业数字化转型要如何做?

企业数字化转型涉及将数字技术全面集成到组织的各个方面&#xff0c;深刻地重塑其运营方式并为客户提供价值。这不仅仅是将已经存在的东西自动化&#xff0c;而是代表了一种重要的文化变革&#xff0c;赋予企业不断挑战既定规范、创新和适应的能力。从运营和供应链管理&#xf…

音视频之旅 - 基础知识

图像基础知识 像素 像素是图像的基本单元&#xff0c;一个个像素就组成了图像。你可以认为像素就是图像中的一个点。在下面这张图中&#xff0c;你可以看到一个个方块&#xff0c;这些方块就是像素 分辨率 图像&#xff08;或视频&#xff09;的分辨率是指图像的大小或尺寸。…

家庭医生上门预约小程序源码系统 附带完整的搭建教程

在当前的医疗服务市场中&#xff0c;患者往往需要前往医院或诊所进行就诊&#xff0c;这不仅浪费了时间和精力&#xff0c;还可能增加交叉感染的风险。因此&#xff0c;开发一款家庭医生上门预约小程序源码系统&#xff0c;可以让患者在家中方便快捷地预约医生上门服务&#xf…

让我们向您介绍葡萄酒中的皮诺家族

对于那些喜欢浏览商店里的葡萄酒通道或餐厅的葡萄酒菜单的人来说&#xff0c;你可能也注意到了类似名称的葡萄酒&#xff0c;即灰皮诺和黑皮诺葡萄酒。这葡萄酒有什么区别&#xff1f;他们有任何相似之处吗&#xff1f;今天&#xff0c;我们将一探究竟&#xff01;让我们了解一…

Python设计模式之创建型-单例模式(Singleton)

目录 作用 适用场景 使用模块 使用装饰器 使用元类 __new__方法单例模式 总结 更多关于Python的相关技术点&#xff0c;敬请关注公众号&#xff1a;CTO Plus后续的发文&#xff0c;有问题欢迎后台留言交流。 注意&#xff1a;本代码示例环境Python版本使用最新的Python3…

网络安全缓冲区溢出实验

实验要求实验步骤函数 f00()函数 f01()函数 f02() 实验要求 C 程序 homework08.c 的主函数如下&#xff1a; int main(int argc, char * argv[]) { init_buf(Lbuffer, LEN);switch(argc) {case 1: f00(); break;case 2: f01(); break;case 3: f02(); break; default: f00(); …

STM32F407-14.3.13-01发生外部事件时清除 OCxREF 信号

发生外部事件时清除 OCxREF 信号 对于给定通道&#xff0c;在 ETRF⑧ 输入施加高电平&#xff08;相应 TIMx_CCMRx 寄存器中的 OCxCE⑦ 使能位置“1”&#xff09;&#xff0c;可使 OCxREF⑨ 信号变为低电平。OCxREF⑨ 信号将保持低电平&#xff0c;直到发生下一更新事件 (UEV)…