Java设计模式 _创建者模式_工厂模式(普通工厂和抽象工厂)

一、工厂模式

属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

二、代码示例

场景:花店有不同的花,通过工厂模式来获取花。

1、普通工厂模式
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建规范的工厂类,封装创建实体对象的方法,只需要根据提供的基础信息就能区别出需要返回的实体对象。
(3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。

逻辑关系:
在这里插入图片描述

代码示例:

// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
    // 描述花的信息
    String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
    @Override
    public String desc() {
        return "玫瑰花";
    }
}
// 实现类2,牡丹花
public class Peony implements Flower {
    @Override
    public String desc() {
        return "牡丹花";
    }
}
// 定义花的创建工厂类
public class FlowerFactory {
	// 根据花的名称返回创建对象
    public Flower createFlower(String message){
        if ("玫瑰".equals(message)){
            return new Rose();
        } else {
            return new Peony();
        }
    }
}
// 测试类
public class ZTest {
    public static void main(String[] args) {
        FlowerFactory flowerFactory = new FlowerFactory();
        Flower flower = flowerFactory.createFlower("玫瑰");
        System.out.println(flower.desc());

        flower = flowerFactory.createFlower("牡丹");
        System.out.println(flower.desc());
    }
}

运行结果:
在这里插入图片描述
由运行结果看到,只要对工厂类提供基础的信息描述文字,就能得到对应的花的实体对象。
总结:
仅定义一个工厂用于创建所有可能的实例,根据描述信息创建对应的实例(相当于知道的花的名称,然后去找花店得到花)。

2、抽象工厂示例
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建抽象的规范工厂(抽象类),定义统一的创建方法(抽象方法)
(3)、创建每一种实体的工厂类,实现规范工厂的抽象方法用来创建对应的实例对象
(4)、定义抽象工厂,不同场景下构建不同的实例工厂来创建对象

逻辑关系:
在这里插入图片描述
代码示例:

// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {
    // 描述花的信息
    String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {
    @Override
    public String desc() {
        return "玫瑰花";
    }
}
// 实现类2,牡丹花
public class Peony implements Flower {
    @Override
    public String desc() {
        return "牡丹花";
    }
}

// 定义抽象工厂和抽象创建方法
public abstract class FlowerFactory {
    abstract Flower createFlower();
}
// 定义玫瑰的实例工厂,实现抽象工厂
public class RoseFactory extends FlowerFactory {
     public Flower createFlower(){
         return new Rose();
     };
}
// 定义牡丹的实例工厂,实现抽象工厂
public class PeonyFactory extends FlowerFactory {
     public Flower createFlower(){
         return new Peony();
     };
}
// 测试方法
public class ZTest {
    public static void main(String[] args) {
        FlowerFactory flowerFactory = new RoseFactory();
        Flower flower = flowerFactory.createFlower();
        System.out.println(flower.desc());

        flowerFactory = new PeonyFactory();
        flower = flowerFactory.createFlower();
        System.out.println(flower.desc());
    }
}

运行结果
在这里插入图片描述
总结:
需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。

三、普通工厂和抽象工厂对比

两种方法都实现了封装创建实例的功能。
但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。
抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。
总结来说,工厂模式和抽象工厂模式都有其独特的优点和适用场景。工厂模式适用于创建单个对象的情况,而抽象工厂模式适用于创建一系列相关的产品对象。在选择使用哪种模式时,应根据具体的业务需求和系统架构进行权衡和选择。

学海无涯苦作舟!!!

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

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

相关文章

Spring - 5 ( 8000 字 Spring 入门级教程 )

一:Spring IoC&DI 1.1 方法注解 Bean 类注解是添加到某个类上的, 但是存在两个问题: 使用外部包里的类, 没办法添加类注解⼀个类, 需要多个对象, ⽐如多个数据源 这种场景, 我们就需要使用方法注解 Bean 我们先来看方法注解如何使用: public c…

AI-数学-高中-42导数的概念与意义

原作者视频:【导数】【一数辞典】1导数的概念与意义_哔哩哔哩_bilibili .a是加速度;

OpenAI 笔记:获取embedding

1 输入openai的api key from openai import OpenAIclient OpenAI(api_key**) 2 举例 response client.embeddings.create(input"Hello",model"text-embedding-3-small" )print(response.data[0].embedding) 默认情况下,text-embedding-3-s…

配置Linux【虚拟机】与 windows【宿主机】网络互通 (面向小白,简单操作)

1. 启动虚拟机,运行Linux系统 这里我使用 VMware Workstation Pro 来运行Linux系统(cent-os7)2. 鼠标右键打开终端 3. 输入 cd /etc/sysconfig/network-scripts , 然后输入ls ,查看当前目录下的网卡 一般来说,虚拟机的…

计算机网络基础认识

本篇文章是我在B站上看到关于计算机网络的介绍视频收到的启发。本篇文章的内容来自【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 一、物理层 从常理来说&#xff0c;进行连个设备之间的通讯&#xff0c;首先最容易想到的就是使用一根线连接两个设备进行通讯。但是…

Docker的数据管理、网络通信和dockerfile

目录 一、Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 2. 数据卷容器 2.1 创建数据卷容器 2.2 使用--volume-from来挂载test1 二、端口映射 三、容器互联 1. 创建容器互联 ​编辑2. 进入test2测试&#xff08;ping 容器名/别名&#xff09; 四、Dock…

【弱监督点云分割】All Points Matter:用于弱监督三维分割的熵细化分布对齐

All Points Matter: Entropy-Regularized Distribution Alignment for Weakly-supervised 3D Segmentation 摘要&#xff1a; 伪标签被广泛应用于弱监督三维分割任务中&#xff0c;在这种任务中&#xff0c;只有稀疏的地面真实标签可供学习使用。现有方法通常依赖经验标签选择…

用立创EDA实现一个小项目

项目介绍 名称&#xff1a;蓝牙音响 功能&#xff1a;按键切换 蓝牙控制 语音控制 项目流程 市场调研产品立项----老板--经理硬件&#xff08;外观、尺寸、大小、使用环境&#xff09;软件&#xff08;代码开发环节&#xff09;产品测试 以管理员身份运行 新建文件夹&…

Python学习从0开始——项目一day02数据库连接

Python学习从0开始——项目一day02数据库连接 一、在线云数据库二、测试数据库连接三、数据库驱动介绍四、SQL执行4.1插入测试数据4.2安装数据库连接模块4.3测试SQL语句执行4.4执行SQL的固定步骤及示例 一、在线云数据库 找了一个在线数据库&#xff0c;需要邮箱注册&#xff…

使用Docker搭建Redis主从集群

文章目录 ☃️前言☃️搭建❄️❄️架构❄️❄️实例说明❄️❄️搭建第一个服务器上的两个实例❄️❄️搭建第二个服务器上的一个实例 ☃️开启主从❄️❄️改配置❄️❄️重启从节点 ☃️验证 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 …

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制婴儿性别比例饼图

在MATLAB 中可以使用 pie 函数来创建饼图。饼图是一种展示不同部分占总体的相对比例的图表。 本示例从“婴儿出生数据.csv”文件读取婴儿出生数据&#xff0c;然后计算男性和女性婴儿的数量&#xff0c;使用MATLAB绘制饼图。 配套图书链接&#xff1a;https://item.jd.com…

【ruoyi-vue】axios的封装理解和基本使用

axios的配置 ruoyi的前端对axios进行了封装&#xff0c;让我们发get请求或者是post请求更加方便了。 ruoyi对axios的封装在下面文件中&#xff1a;打开文件&#xff0c;可以看到它有三个显眼的方法&#xff0c;分别是request拦截器、response拦截器和通用下载方法。ruoYi接口地…

MySQL主从的应用

说明&#xff1a;本文介绍MySQL主从在实际中的应用。主从搭建和问题参考下面两篇文章&#xff1a; MySQL主从结构搭建 搭建MySQL主从结构时的问题 数据迁移 当我们搭建完MySQL主从&#xff0c;第一步当然是把历史数据导入到主从结构中。有以下两种方式&#xff1a; 开启主从…

Linux 网络操作命令Telnet

Telnet 尽管 Telnet 已经逐渐被更安全的 SSH 协议所取代&#xff0c;但在某些特定场景下&#xff0c;如对旧系统的维护或教育目的&#xff0c;Telnet 仍然有其使用价值。本文将介绍如何在 Linux 系统中安装 Telnet 客户端&#xff0c;以及如何使用它进行远程登录。 用户使用 t…

什么是DTU和串口服务器的区别

在工业物联网的快速发展中&#xff0c;数据传输单元&#xff08;DTU&#xff09;和串口服务器作为两种关键设备&#xff0c;各自扮演着重要的角色。对于传统行业来说&#xff0c;了解它们的基本概念和区别&#xff0c;有助于更好地选择和应用这些技术&#xff0c;提升生产效率和…

Rust基本数据类型-切片

一、切片是什么&#xff0c;怎么用 1、切片是什么 切片并不是 Rust 独有的概念&#xff0c;在 Go 语言中就非常流行&#xff0c;它允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 对于字符串而言&#xff0c;切片就是对 String 类型中某一部分的引用&…

基于单片机的空气质量检测系统设计

摘要:随着社会经济的不断发展,人们的生活水平日益提高,健康与养生成为了全民关注的热点话题,空气质量地不断下降也引起了社会的广泛关注,如何了解家居内空气质量的情况也成了亟需解决的问题。在此背景下,本文针对室内空气的质量问题设计了基于单片机的空气质量检测系统,…

Mysql个人总结

前言 又来水字数啦&#xff0c;这次主要讲一下MySQL的常用概念&#xff0c;难点的就必须上项目讲解了&#xff0c;而且比较基础面试基本都会问一些&#xff0c;用的话&#xff0c;不少优化都从这里入手 操作数据库 1、创建数据库 CREATE DATABASE [IF NOT EXISTS] 数据库名;…

【AI相关】《这就是ChatGPT》读书笔记

《这就是ChatGPT》 斯蒂芬沃尔弗拉姆 这本书用了两天就一口气读完了&#xff0c;通篇读完后&#xff0c;这本书主要是介绍了ChatGPT怎么能做到生成内容的一些背后的原理逻辑&#xff0c;总结一下这本书是ChatGPT通过大量的数据&#xff08;这些数据来自网络、书籍等等类似于数据…

Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式&#xff0c;它们可以直接访问同一块内存区域&#xff0c;因此比使用管道或消息队列等通信机制更高效。在多进程程序中&#xff0c;共享内存通常与信号量一起使用&#xff0c;以确保对共享内存的访问是线程安全的。 一、打开/创建…