面试官被我安排上了!理由是我把工厂模式探的清清楚楚,hhh

初级Java开发面试题————操作数据库方式与设计模式应用 1. 在业务层使用JDBC直接操作数据库-最简单,最直接的操作 1)数据库url,username,password写死在代码中 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; String user="scott"; String password="tiger"; C 阅读详情

简单工厂模式是由工厂对象决定创建哪一种产品,虽然不属于23种设计模式,但是也是工厂模式进阶的由来。

模拟场景:

暑假太过无聊,就自己在家打算做一个MP3播放器,其中包括播放器的程序设计也是自己来搞定的。如下结构

//歌曲播放接口
public interface ISong {
    void  Play();
}

//流行歌曲播放
public class PopularISong implements ISong {
    @Override
    public void Play() {
        System.out.println("接下来播放流行歌曲~");
    }
}

//古典歌曲播放
public class ClassicalSongs  implements ISong {
    @Override
    public void Play() {
        System.out.println("接下来播放古典歌曲~");
    }
}

//MP3播放操作
public class MP3 {
    public  enum  SongType
    {
       PopularSongType,//流行歌曲
       ClassicalSongsType//古典歌曲
       //....其他类型
    }
    public ISong Pay(SongType type)
    {
        if(type==SongType.PopularSongType)
        {
            return new PopularISong();
        }
        else if(type==SongType.ClassicalSongsType)
        {
            return new ClassicalSongs();
        }
        return  null;
    }
}

public class Text {
    public static void main(String[] args) {
        //用户执行操作
        MP3 mp3=new MP3();
        mp3.Pay(MP3.SongType.PopularSongType).Play();
    }
}


程序终于写完了~我在沙发上惬意的用MP3放着流行歌曲,奶奶走过来问我能不能放戏曲,我摸了摸脑袋,说:“也可以”。不过你得等我一下。

1个小时之后,经过重新拆卸硬件,编写代码,增加了戏曲的类,又重新修改了MP3类中if else分支。

else  if(type==SongType.TraditionalOperaType)//戏曲
{
    //.....
}

给奶奶用了之后,很满意还告诉我爸表扬我,我爸知道了嚷嚷要听相声。我心想这不是又要再去写一遍代码…这显然不行。

简单工厂模式中包含了必要的逻辑判断,根据用户选择的条件动态实例化生成相关的类,明确区分了各自的职责和权力。但是这里也违反了开放-封闭原则,工厂类集中了所有的逻辑判断,一旦要增加一个还得修改逻辑判断的代码。

工厂模式

有了上述的经验,我决定重新改写程序,以防止他们又想听其它类型的歌曲,我又要重新修改代码逻辑判断。

//工厂类
public interface IFactory {
    ISong CreateSong();
}

//产品歌曲类
public interface ISong {
    void  Play();
}

具体工厂类:

//具体工厂类 用于创建流行歌曲
public class PopularSongFactory  implements  IFactory{
    @Override
    public ISong CreateSong() {
        return  new PopularISong();
    }
}

//具体工厂类 用于创建古典歌曲
public class ClassicalSongsFactory implements  IFactory{
    @Override
    public ISong CreateSong() {
        return new ClassicalSongs();
    }
}

具体歌曲类:

//具体歌曲类:古典
public class ClassicalSongs  implements ISong {
    @Override
    public void Play() {
        System.out.println("接下来播放古典歌曲~");
    }
}

//具体歌曲类:流行
public class PopularISong implements ISong {
    @Override
    public void Play() {
        System.out.println("接下来播放流行歌曲~");
    }
}

用户操作层面:

public static void main(String[] args) {
    //用户执行操作
    IFactory factory=new ClassicalSongsFactory();//古典工厂  只需要更改这里的类型,选择权交给用户去生成对应的实例
    ClassicalSongs songs= (ClassicalSongs) factory.CreateSong();
    songs.Play();
}


工厂模式把要决定实例化哪一个工厂的选择判断放到了客户端,保持了简单工厂模式的优点又克服了缺点,不需要做大的变动就可以改变,降低了程序的耦合,但是每需要增加一个类型的时候,又需要创建一个产品和工厂。这个可以利用反射来解决分支判断的问题。


最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。记得给我一个一键三连哦!老子爱你们!

面试题——JDK、JRE、javac与JVM的关系 .java为Java的源文件后缀,编写的代码需要写在.java文件中。 Javac编译器,用于读取Java源代码,并将其编译成字节代码。经过javac编译后形成.class,是字节码文件。 Java虚拟机(JVM)运行.class文件从而实现程序的运行。 - 1、JVM——java virtual machine,就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,//加入Java开发交流君样:756584822一起吹水聊天这种类文件 阅读详情

相关推荐

Java面试题总结论IOC、AOP、Spring、注解

什么是Java的反射 反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。 Java获取Class类对象的三个方法 第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。 Class clz = Class.forName(“java.lang.String”); 第二种,使用 .class 方法。 这种方法只适合在编译前就知道操作的 Class。 Class clz = String.class; 第

Java_Goder 260

面试官问我Java数组转List的三种方式是什么?我直呼内行,太卷了

前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析。 一.最常见方式 通过 Arrays.asList(strArray) 方式,将数组转换List后,不能对List增删,只能查改,否则抛异常。 List list = Arrays.asList(strArray); private void testArrayCastToListError() { String[] strArray = new String[2]; List

Java_Goder 1793

LVI-SAM实战:如何在Ubuntu20.04上快速复现激光-视觉-惯性里程计系统

本文详细解析了在Ubuntu 20.04环境下部署和优化LVI-SAM激光-视觉-惯性里程计系统的全流程。从环境配置、依赖安装到源码编译和实战调参,提供了完整的解决方案和性能优化策略,帮助开发者快速实现厘米级精度的实时位姿估计。

m3n5b7v8c9x的博客 1047

面试加分项——Java引用数据类型 和数据类型的拓展

java中的应用数据类型 类(class) 类是一个模板,它描述一类对象的行为和状态。 接口(interface) intenface 关键字 在接口中所有方法都是public abstract可省可不省 理解:接口本身没有实现任何功能,接口表- -种能力 ,拓展很方便(通过此口实现具体的功能) 接口是一种约定(体现在名称和注释.上) C#中不允许写public static 接口不能包含字段,但可以包含属性使用: 接口的特性? public static final ​ •

Java_Goder 832

【深度排查】VScode 远程 SSH 连接失败:从网络握手到服务部署的全链路诊断指南

本文详细解析了VScode远程SSH连接失败的常见原因及解决方案,从基础网络排查到SSH服务配置,再到VScode特有的问题处理。特别针对Ubuntu和TrueNAS系统提供了具体配置建议,帮助开发者快速解决'Could not establish connection'等连接问题,提升远程开发效率。

weixin_30301449的博客 446

简易背单词系统C/C++

#include<stdio.h> #include<string.h> int F=20,N=100,k=0; int score[100]; int count=0; void hello(); void add(); void preview(); void mdelete(); void etc(); void cte(); void mscore(); void...

青木年华 9154

在面试中,老是遇到反射机制及应用??还不来复习一下!

反射机制及应用 什么是反射 在程序运行状态中,对于任意一个类或对象,都能够获取到这个类的所有属性和方法(包括私有属性和方法),这种动态获取信息以及动态调用对象方法的功能就称为反射机制。简单来讲,通过反射,类对我们是完全透明的,想要获取任何东西都可以。 Class对象 我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象。这个实例对象称之为类对象,也就是Class对象。 Class类的实例对象表示正在运行的Java应用程序中的类和接口,也就是JVM中的每一个实例,每一个类都有唯

Java_Goder 402

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1456

面试必备项Java的IO流,我今天就被字节面试官问了~

1. File类 (java.io.File) 文件和目录文件名的抽象表达形式 File类的实例化 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 File(String parent, String child) 根据 parent 路径名字符串和 c

Java_Goder 279

华为OD机考双机位C卷 - 员工派遣 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 员工派遣 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1035

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1606

Java中引用数据类型和数据类型的拓展,一篇文章带你盘的明明白白!

Java中的应用数据类型 类(class) 类是一个模板,它描述一类对象的行为和状态。 接口(interface) intenface 关键字 在接口中所有方法都是public abstract可省可不省 理解:接口本身没有实现任何功能,接口表- -种能力 ,拓展很方便(通过此口实现具体的功能) 接口是一种约定(体现在名称和注释.上) C#中不允许写public static 接口不能包含字段,但可以包含属性使用: 接口的特性? public static final ​ •

Java_Goder 258

PyTorch实战(19)——变分自编码器(Variational Autoencoder,VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。本节中,将介绍变分自编码器的基本概念,并使用 PyTorch 实现变分自编码器生成新图像。

盼小辉丶的博客 2891

你真明白Java内存溢出吗?我看你就是浑水摸鱼!!!

Java内存溢出示例(堆溢出、栈溢出) 堆溢出: /** * @author LXA * 堆溢出 */ public class Heap { public static void main(String[] args) { ArrayList list=new ArrayList(); while(true) { list.add(new Heap()); } } }

Java_Goder 242

【Bug已解决】npm install -g @anthropic-ai/claude-code 出现 EACCES: permission denied 解决方案

方案适用场景推荐指数nvm 管理 Node长期开发环境,一次配置永久生效⭐⭐⭐⭐⭐修改 npm 全局目录不想引入 nvm,快速解决⭐⭐⭐⭐修复现有目录权限之前用过 sudo 装包,需要修复⭐⭐⭐Windows 管理员/改目录Windows 平台专用⭐⭐⭐⭐官方原生安装脚本想彻底避开 npm 权限问题⭐⭐⭐⭐报的本质是npm 全局安装目录的属主权限与当前执行用户不匹配,而不是 npm 或 Claude Code 本身有问题。不要用sudo"强行"解决。

一键难忘的博客 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

面试一定会问的关键词!!!static、final、abstract

1. static关键词 作用 static可以修饰成员方法 ==》类方法 static可以修饰成员变量 ==》类变量 static可以修饰代码块 ==》静态代码块 static不可以修饰构造方法,构造方法仅支持 四个 访问权限修饰符 静态非静态区别 静态方法中必须使用静态的变量和方法 成员方法中可以使用成员变量,全局变量,可以调用成员方法 何时使用静态变量和静态方法 所有对象共同操作一个变量时,将其声明为全局变量 方法中不操作局部变量和局部方法时,将其声明为全局 2. final关键

Java_Goder 237

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

面试问到Java常用类:System类,这也太偏门了吧!

System 系统类主要用于获取系统的属性数据和其他操作,构造方法私有 常用方法 方法名 说明 static void arraycopy(); 复制数组 static long currentTimeMillis(); 获取当前系统时间,返回的是毫秒值 static void exit(int status); 退出 jvm,如果参数是0表示正常退出jvm,非0表示异常退出 jvm arraycopy(); 方法 实例: import java.util.Arrays;

Java_Goder 190

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 333

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 19

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 143

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 206

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 172

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 98

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 220

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 232
上一篇: 【强烈推荐】Java主函数入口,此篇文章极短极细,慎入
下一篇: 面试加分项——Java引用数据类型 和数据类型的拓展
Java大鲨鱼
博客等级 码龄5年 2211粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值