设计模式-简单工厂模式(静态工厂模式)java实现

news2024/11/25 23:14:40

 介绍

简单工厂模式根据所提供的参数数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。

 

意图

提供一个类,负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程

角色及其职责

(1)工厂(Creator)角色:是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

(2) 抽象(Produet)角色:是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口。

(3) 具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象

都是充当这个角色的某个具体类的实例。一般来讲,它是抽象产品类的子类,实现了抽象产

品类中定义的所有接口方法。

 

 在工厂角色中可以通过参数来判断创建哪种具体的产品子类对象,这个参数可以通过配置文件获取,也可以作为方法参数传入。

例子

下面我来实现一下

一个产品接口,两个产品类Chair,Desk,一个工厂类,通过参数来决定创建哪个具体产品

产品接口

public interface MyProduct {
    //返回产品的具体名称
    String getProductName();
}

具体产品

public class Chair implements MyProduct{
    @Override
    public String getProductName() {
        return "椅子";
    }
}
public class Desk implements MyProduct{
    @Override
    public String getProductName() {
        return "桌子";
    }
}

工厂类

/**
 * @Classname MyProductFactory
 * @author: 我心
 * @Description: 产品工厂类
 * @Date 2022/11/26 21:51
 * @Created by Lenovo
 */
public class MyProductFactory {
    public MyProduct getProduct(String code){
        MyProduct product=null;//要返回的产品对象
        //如果参数是c,则创建Chair对象
        if (code.equals("c")){
            product=new Chair();
        }
        //如果参数是d,则创建Desk对象
        else if( code.equals("d")){
            product=new Desk();
        }
        return product;
    }
}

运行代码

public class Main {
    public static void main(String[] args) {
        //这时候我们就不需要关注具体创建的是什么对象,只需要知道它是所需的产品即可,隐藏了创建对象的细节
        MyProductFactory productFactory=new MyProductFactory();
        //然后我们直接调用产品的公共接口方法使用即可,不管是什么产品,都实现了这一个接口,我们也不需要关注接口的细节
        MyProduct c = productFactory.getProduct("c");
        System.out.println(c.getProductName());
    }
}

运行结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机械工业信息研究院:2023年中国生物制药行业报告(附下载)

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 医药工业宏观情况分析 2021 年生物制药带动医药工业经 济指标大幅增长。根据统计,2021年规 模以上医药工业增加值同比增长 23.1%,增速较上年同期提升 17.2个百分点&#xff0…

MVSnet点云定量评估指标总结

根据MVSnet论文[1]原文说明,点云评估主要从准确性和完整性两个方面来评估。 针对准确性的评估,采用平均距离指标来度量,具体指标分别为Acc、Comp、overall,准确性指标越低越好,表示R与G之间的距离越小,恢复…

《CodeGeeX2 一个让你编码效率翻倍的扩展,分享几个使用小技巧》学习笔记

《CodeGeeX2 一个让你编码效率翻倍的扩展,分享几个使用小技巧》学习笔记 【Only Key Control】使用按键触发提示 使用注释来提升CodeGeeX生成代码的准确性 在函数的顶部添加对函数的说明然后输入function的关键字再使用【Alt /】来触发自动补全 使用CodeGeeX解释…

构建Docker容器监控系统(Cadvisor +Prometheus+Grafana)

Cadvisor PrometheusGrafana 1.1、Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图表的形式向用户展示。 1.2、安装docker-ce [rootloc…

LeetCode 热题 100 JavaScript--98. 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 *** Definition for …

根据渲染数据长度动态渲染后缀图标

在动态获取数据时&#xff0c;想要渲染后面的图标是根据数据的长度渲染图标位置&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <el-row :gutter"60"><el-col :span"24"><el-form-item><el-input v-model.trim"form…

zuul实现黑名单,request多次读取问题,stream close

一&#xff0c;背景及设计 1.需要在网关实现黑名单功能&#xff0c;实现拦截指定接口。黑名单用户&#xff0c;会加入指定黑名单列表&#xff0c;关联对应功能&#xff0c;如用户登录&#xff0c;用户下单&#xff0c;用户接单。 2.表设计 平台表&#xff1a;不同系统 黑名单…

TimedCache 类的作用和使用

TimedCache 类的作用是实现一个带有过期时间的缓存。它允许存储键值对&#xff0c;并在一定时间后自动删除过期的键值对。使用 TimedCache 可以提高程序的性能&#xff0c;减少对数据库或其他资源的访问次数。 使用 TimedCache 类时&#xff0c;可以按照以下步骤进行操作&…

干货!esp8266+ds3231低功耗解决方案,在特定时间唤醒

最近首次接触esp8266&#xff0c;也是第一次接触硬件&#xff0c;在一个墨水屏日历项目上遇到了低功耗问题&#xff0c;特此记录。 此墨水屏日历不需要一直处于启动状态&#xff0c;我希望它每几小时或者每天启动一次即可。 解决方案 1&#xff1a;仅使用内部 RTC 通过将GPIO…

Android监听设备亮灭屏广播(动态广播代码)

MainActivity中 public class MainActivity extends Activity {private WakeAndLockReceiver wakeAndLockReceiver;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册亮屏和息…

强化学习研究 PG

由于一些原因&#xff0c; 需要学习一下强化学习。用这篇博客来学习吧&#xff0c; 用的资料是李宏毅老师的强化学习课程。 深度强化学习(DRL)-李宏毅1-8课&#xff08;全&#xff09;_哔哩哔哩_bilibili 这篇文章的目的是看懂公式&#xff0c; 毕竟这是我的弱中弱。 强化…

想要实现高效数据复制?Paxos并不总是最佳选择!

数据复制典型的算法就是Paxo和Raft。 1 分片元数据的存储 分布式存储系统中&#xff0c;收到客户端请求后&#xff0c;承担路由功能的节点&#xff1a; 先访问分片元数据&#xff08;简称元数据&#xff09;&#xff0c;确定分片对应节点然后才访问真正数据 元数据&#xf…

PoseiSwap 开启“Poseidon”池,治理体系或将全面开启

PoseiSwap曾在前不久分别以IDO、IEO的方式推出了POSE通证&#xff0c;但PoseiSwap DEX中并未向除Zepoch节点外的角色开放POSE资产的交易。而在前不久&#xff0c;PoseiSwap推出了全新的“Poseidon”池&#xff0c;该池将向所有用户开放&#xff0c;并允许用户自由的进行质押、交…

Python机器学习实战-建立随机森林模型预测肾脏疾病(附源码和实现效果)

实现功能 建立随机森林模型预测肾脏疾病 实现代码 import pandas as pd import warnings warnings.filterwarnings("ignore") pd.set_option(display.max_columns, 26)#读取数据 df pd.read_csv("E:\数据杂坛\datasets\kidney_disease.csv") dfpd.Data…

计算机组成原理-笔记-第二章

二、第二章——数据的表示和运算 1、进位制度&#xff08;二进制、十进制&#xff09; 2、BCD码&#xff08;余三码、2421码&#xff09; 编码方式 功能 好处 弊处 BCD码 将每个十进制数码转换为4位二进制码 精度高&#xff0c;适合直接用于数码管或LED等显示设备 编码…

docker 安装hive

记录一下使用docker快速搭建部署hive环境 目录 写在前面 步骤 安装docker 安装docker安装docker-compose配置docker国内镜像源&#xff08;可选&#xff09; 安装git & 配置github部署Hive docker-hive开始部署 使用Hive命令行收尾工作 安装vi、lrzsz关闭相关命令 END…

解锁Java迭代器:优雅遍历集合元素的秘密武器

解锁Java迭代器&#xff1a;优雅遍历集合元素的秘密武器 你是否曾想过&#xff0c;在Java的编程世界中&#xff0c;有没有一种方法可以优雅地遍历集合中的元素&#xff0c;而不需要关心底层实现&#xff1f;答案是肯定的&#xff0c;那就是——迭代器&#xff08;Iterator&…

使用vite创建Vue/React前端项目,配置@别名和Sass样式,又快又方便

Vite官方网站&#xff1a;Vite | 下一代的前端工具链 Vite 并不是基于 Webpack 的&#xff0c;它有自己的开发服务器&#xff0c;利用浏览器中的原生 ES 模块。这种架构使得 Vite 比 Webpack 的开发服务器快了好几个数量级。Vite 采用 Rollup 进行构建&#xff0c;速度也更快…

【前端|CSS】5种经典布局

页面布局是样式开发的第一步&#xff0c;也是 CSS 最重要的功能之一。 常用的页面布局&#xff0c;其实就那么几个。下面我会介绍5个经典布局&#xff0c;只要掌握了它们&#xff0c;就能应对绝大多数常规页面。 这几个布局都是自适应的&#xff0c;自动适配桌面设备和移动设备…

【BASH】回顾与知识点梳理(十五)

【BASH】回顾与知识点梳理 十五 十五. 指令与文件的搜寻15.1 脚本文件名的搜寻which (寻找『执行档』) 15.2 文件档名的搜寻whereis (由一些特定的目录中寻找文件文件名)locate / updatedbfind与时间有关的选项与使用者或组名有关的参数与文件权限及名称有关的参数额外可进行的…