第一条:考虑使用静态工厂方法代替构造器
使用静态工厂方法代替构造器的几大优势:
- 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
- 不必再每次调用时都创建一个新的实例。 例如单例类就使用了静态工厂方法。
- 静态工厂方法可以返回原返回类型的任何子类型的对象实例。 如返回类型是Service,可以返回Service类型的任何子类型
- 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。
静态工厂方法的一些惯用名称:
- valueOf 该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
- of valueOf的一种更为简洁的替代。
- getInstance 返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
- newInstance 返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
- getType Type指明返回的实例的类型。
- newType Type指明返回的实例的类型。
利用静态工厂方法实现的服务提供者框架模式 :
服务接口 :
1 public interface Service { 2 /** 3 * n种服务 4 */ 5 //..... 6 }
服务提供者接口:
1 public interface Provider { 2 /** 3 * 可以提供的n种服务 4 */ 5 Service newService(); 6 }
具有服务提供者注册API和服务访问API的 服务类:
1 public class Services { 2 //私有化构造器 通过静态工厂方法来得到想要的Service实例 3 private Services(){} 4 //用来保存服务提供者对象的Map对象 5 private static final Map<String, Provider> providerMap = new HashMap<String, Provider>(); 6 //服务提供者对象的默认 key值 7 private static final String DEFAULT_NAME = "<def>"; 8 9 //提供静态工厂方法 将未提供key值得服务提供者对象 添加到Map对象中 10 public static void registerProvider(Provider provider) 11 { 12 registerProvider(Services.DEFAULT_NAME, provider); 13 } 14 15 //提供静态工厂方法 将提供key值的服务提供者对象 添加到Map对象中 16 public static void registerProvider(String name , Provider provider) 17 { 18 providerMap.put(name, provider); 19 } 20 21 //提供静态工厂方法 得到最终的服务对象 22 public static Service newInstance() 23 { 24 return newInstance(DEFAULT_NAME); 25 } 26 //提供静态工厂方法 得到最终的服务对象 27 public static Service newInstance(String name) 28 { 29 Provider p = providerMap.get(name); 30 31 if(p == null) 32 { 33 throw new IllegalArgumentException("This provider not found"); 34 } 35 36 return p.newService(); 37 } 38 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥