Java基础知识之设计模式--工厂模式
Java设计模式--工厂模式
声明:本文根据慕课网卜奇老师的精品课程整理来的:慕课网
什么是设计模式(Design Pattern)?
设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。
什么情况下使用工厂模式?
有一组类似的对象需要创建。
在编码时不能预见需要创建哪种类的实例。
系统需要考虑扩展性,不应依赖于产品类实例如何被创建,组合和表达的细节。
工厂模式的分类?
工厂模式和抽象工厂模式
工厂模式常见的应用场景?
JDBC的实现,spring框架中Bean的实例化。
工厂模式的实现对我们有什么帮助?
系统可以在不修改具体工厂角色的情况下引进新的产品
客户端不必关心对象如何创建,明确了职责
更好的理解了面向对象的原则,面向接口编程,而不是面向实现编程
通过一个工厂模式的例子来深入理解工厂模式的应用
1.首先创建一个接口,这个接口是所有具体功能的基础接口
1 public interface HairInterface { 2 /** 3 * 定义接口方法 4 */ 5 public void draw(); 6 }
2.创建三个接口的实现
1 public class RightHair implements HairInterface { 2 @Override 3 public void draw() { 4 System.out.println("-------右偏分发型-----"); 5 } 6 }
1 public class LeftHair implements HairInterface { 2 @Override 3 public void draw() { 4 System.out.println("-------左偏分发型------"); 5 } 6 }
1 public class InHair implements HairInterface { 2 @Override 3 public void draw() { 4 System.out.println("-------中分发型-----"); 5 } 6 }
3.创建配置文件,确定映射关系
4.创建读取配置文件的工具类
1 public class PropertiesReader { 2 public Map<String, String> getProperties() { 3 Properties props = new Properties(); 4 Map<String, String> map = new HashMap<String, String>(); 5 try { 6 InputStream in = getClass().getResourceAsStream("type.properties"); 7 props.load(in); 8 Enumeration en = props.propertyNames(); 9 while (en.hasMoreElements()) { 10 String key = (String) en.nextElement(); 11 String property = props.getProperty(key); 12 map.put(key, property); 13 // System.out.println(key + " " + property); 14 } 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 return map; 19 } 20 }
5.创建工厂方法,进行类的实例化
1 public class HairFactory { 2 /** 3 * 根据类型来创建对象 4 * @Description: TODO 5 * @param key 6 * @return 7 * @returnType: HairInterface 8 */ 9 public HairInterface getHair(String key){ 10 try { 11 //通过读取工具类获取properties文件的配置信息 12 Map<String,String> map = new PropertiesReader().getProperties(); 13 //根据映射获取类的路径 14 HairInterface hairInterface = (HairInterface) Class.forName(map.get(key)).newInstance(); 15 if(hairInterface!=null){ 16 return hairInterface; 17 } 18 } catch (InstantiationException e) { 19 e.printStackTrace(); 20 } catch (IllegalAccessException e) { 21 e.printStackTrace(); 22 } catch (ClassNotFoundException e) { 23 e.printStackTrace(); 24 } 25 return null; 26 } 27 }
6.编写测试类,进行功能实现
public class Test { public static void main(String[] args) { //创建工厂类实例 HairFactory factory= new HairFactory(); //根据配置文件信息获取具体实例 HairInterface interfaceImpl = factory.getHair("in"); if(interfaceImpl !=null) interfaceImpl.draw(); } }
7.测试结果,成功实例化对象,实现方法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库