尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java设计模式--工厂模式
1. 工厂模式的作用解决接口选择的问题2. 何时使用当我们明确地知道不同条件下创建不同实例时。3. 使用场景--java的可移植性java--JVM工厂--操作系统--hibernate和mybatis切换数据库4. 注意事项作为一种创建类模式在任何需要生成复杂对象的地方都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式而简单对象特别是只需要通过 new 就可以完成创建的对象无需使用工厂模式。分析一下程序package test; public class test { public static void main(String[] args) { Apple apple new Apple(); apple.eat(); //如果突然不想吃苹果想吃香蕉就要重新实例化一个香蕉对象 //如此一来每次切换都要更新客户端的代码 //能不能有一种方式用户想吃什么就传入什么不需要改动客户端的代码 } } class Apple{ public void eat() { System.out.println(吃苹果。。。); } } class Banana{ public void eat() { System.out.println(吃香蕉。。。); } }5. 改进引入工厂类package test; public class test { public static void main(String[] args) { Fruit fruit Factory.getInstance(args[0]); fruit.eat(); } } abstract class Fruit{ //模板类 public void eat(){} ; } class Apple extends Fruit{ public void eat() { System.out.println(吃苹果。。。); } } class Banana extends Fruit{ public void eat() { System.out.println(吃香蕉。。。); } } interface Factory{ //工厂类 public static Fruit getInstance(String fruit) { if(apple.equals(fruit)) { return new Apple(); }else if(banana.equals(fruit)) { return new Banana(); }else { return null; } } }如此一来只要是水果工厂里面有的水果用户只要输入水果名称就可以吃到该水果不需要自己再去生产该水果生产的工作交由水果工厂负责。但是这个代码还是有一个特别麻烦的地方那就是每当接口产生一个新的子类的时候接口本身也必须修改可扩展性极低。6. 利用反射改进工厂模式package test; public class TestFactory { public static void main(String[] args) throws Exception { Fruit instance Factory.getInstance(test.Apple); instance.eat(); } } interface Fruit{ public void eat(); } class Apple implements Fruit{ Override public void eat() { System.out.println(吃苹果...); } } class Banana implements Fruit{ Override public void eat() { System.out.println(吃香蕉....); } } class Factory{ public static Fruit getInstance(String fruitClass) throws Exception { return (Fruit)Class.forName(fruitClass).newInstance(); //一句代码搞定以后有新的子类也不需要再修改工厂类了 } }但是这样还是不够完美因为客户端需要明确知道子类的详细名称包.类名并且每次切换子类都要改动客户端改进的方法是利用配置文件将类名写进配置文件中切换的时候全部代码都不需要改动只要改动配置文件就可以了。7. 利用配置温文件管理工程类名import java.util.ResourceBundle; public class TestFactory { public static final ResourceBundle rb ResourceBundle.getBundle(fruit);//使用配置文件 public static void main(String[] args) throws Exception { Fruit instance Factory.getInstance(rb.getString(fruitClass)); instance.eat(); } } interface Fruit{ public void eat(); } class Apple implements Fruit{ Override public void eat() { System.out.println(吃苹果...); } } class Banana implements Fruit{ Override public void eat() { System.out.println(吃香蕉....); } } class Factory{ public static Fruit getInstance(String fruitClass) throws Exception { return (Fruit)Class.forName(fruitClass).newInstance(); //一句代码搞定以后有新的子类也不需要再修改工厂类了 } }上面的代码仍不完美不完美之处在于需要用户去手工修改配置文件。所以必须想一种办法把配置写回配置中又可以跟程序进行有效的分离。参考servlet开发的经验使用Annotation来实现配置。8. 利用annotation改进工厂模式package factory; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Factory(className factory.Apple) public class TestFactory3{ public static void main(String[] args) { Fruit fruit; try { fruit getFruit(); fruit.eat(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static Fruit getFruit() throws Exception { Class? cls TestFactory3.class; Factory an cls.getAnnotation(Factory.class);//取得工厂annotation return (Fruit)Class.forName(an.className()).newInstance(); //返回工厂实例 } } interface Fruit{ public void eat(); } class Apple implements Fruit{ Override public void eat() { System.out.println(吃苹果...); } } class Banana implements Fruit{ Override public void eat() { System.out.println(吃香蕉....); } } //写自己的annotation Retention(RetentionPolicy.RUNTIME) interface Factory{ public String className() ; }9. 继续优化简化客户端annotationpackage factory; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Factory(className Banana) public class TestFactory3{ public static void main(String[] args) { Fruit fruit; try { fruit getFruit(); fruit.eat(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static Fruit getFruit() throws Exception { Class? cls TestFactory3.class; Factory an cls.getAnnotation(Factory.class);//取得工厂annotation return (Fruit)Class.forName(Fruit.class.getPackage().getName().an.className()).newInstance(); //返回工厂实例 } } interface Fruit{ public void eat(); } class Apple implements Fruit{ Override public void eat() { System.out.println(吃苹果...); } } class Banana implements Fruit{ Override public void eat() { System.out.println(吃香蕉....); } } //写自己的annotation Retention(RetentionPolicy.RUNTIME) interface Factory{ public String className() ; }
RELATED

相关推荐

Android防撤回终极指南:免Root永久告别消息撤回烦恼

Android防撤回终极指南:免Root永久告别消息撤回烦恼

Android防撤回终极指南:免Root永久告别消息撤回烦恼 【免费下载链接】Anti-recall Android 免root 防撤回神器 ! 项目地址: https://gitcode.com/gh_mirrors/an/Anti-recall 还在为错过重要消息而懊恼吗?当同事撤回工作安排、朋友撤回关键信息时&…

📅 2026/9/13 3:56:10
软件外包报价为什么差很多?先拆需求、工期和交付范围

软件外包报价为什么差很多?先拆需求、工期和交付范围

软件外包报价差很多,并不一定是谁报高了或报低了。更常见的原因是,参与报价的人理解了不同的项目:有人只计算页面开发,有人把需求梳理、接口联调、测试和上线也算进去;有人按现成设计稿估时,有人默认还要补…

📅 2026/9/16 13:44:17
2026最新AI写小说工具测评:实测10款写小说ai软件,新手如何开始写小说?

2026最新AI写小说工具测评:实测10款写小说ai软件,新手如何开始写小说?

最近后台私信收到了非常多的留言,十条里有一大半都是小白在焦虑地询问新手如何开始写小说,卡文写不下去怎么办,以及现在市面上数量繁多的写小说软件到底靠不靠谱。 作为一路从小透明熬过来的连载作者,我很清楚那种深夜对着大纲发呆…

📅 2026/9/12 23:40:48
MORE NEWS

更多资讯

📰

集合竞价抓涨停:通达信选股公式源码与实操避坑指南

简介:这是一份通达信软件集合竞价抓涨停的指标公式源码文档,面向有一定股票软件使用基础、希望提升竞价选股效率的投资者与分析者。文档围绕自创竞价选股绝技展开,核心代码包含虚拟量放大3倍、量比大于10等过滤条件,并结合DYNAINF…

📰

web3.js WebSocket Provider(web3-providers-ws)完整指南:安装、连接、鉴权与自动重连

区块链Web3 【免费下载链接】web3.js Collection of comprehensive TypeScript libraries for Interaction with the Ethereum JSON RPC API and utility functions. 项目地址: https://gitcode.com/gh_mirrors/we/web3.js 点击查看 免费下载 web3-providers-ws 是…

📰

Maglev 深度解析:V8 中层优化编译器的架构、流水线与直接代码生成

语言运行时编译器JIT编译解释器内存管理 【免费下载链接】v8 The official mirror of the V8 Git repository 项目地址: https://gitcode.com/gh_mirrors/v81/v8 点击查看 免费下载 Maglev 是 V8 的中层(mid-tier)优化编译器,定位…

📰

久益采煤机电气控制系统架构解析与故障排查实战

简介:《美国久益长臂采煤机电气控制系统.docx》是一份深度解析久益7LS(JNA)系列采煤机电控系统的专业资料,适合煤矿机电工程师、设备维护人员及矿业院校师生阅读,用于快速掌握采煤机电气系统组成、控制原理与故障排查方法。文档基于久益采煤机…

📰

AI音乐生成提示词指南:用情绪锚点写出高质量歌曲

刚入坑AI音乐那会儿,我跟大多数人一样,提示词写得特别随意。什么"欢快的歌""悲伤的钢琴曲"——结果生成出来的东西,要么旋律像随机拼凑,要么情绪完全跑偏,十次里有八次白瞎。后来我慢慢摸出一个规…

📰

HC32F460硬件浮点单元FPU开启指南与性能优化实测

1. 起点:为什么你的HC32F460需要硬件浮点加速做嵌入式的朋友都知道,Cortex-M4系列和Cortex-M3最明显的区别,就是M4内核多了一个可选的硬件浮点单元(FPU)。HC32F460这颗国产MCU用的正是ARM Cortex-M4F内核,自…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬