第一条:考虑使用静态工厂方法代替构造器

本文探讨了使用静态工厂方法代替构造器的多个优点,包括代码更简洁、能够返回任意子类型实例等。同时介绍了一种利用静态工厂方法实现的服务提供者框架模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用静态工厂方法代替构造器的几大优势:

  1. 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
  2. 不必再每次调用时都创建一个新的实例。  例如单例类就使用了静态工厂方法。
  3. 静态工厂方法可以返回原返回类型的任何子类型的对象实例。   如返回类型是Service,可以返回Service类型的任何子类型
  4. 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。

静态工厂方法的一些惯用名称:

  1. valueOf    该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
  2. of    valueOf的一种更为简洁的替代。
  3. getInstance   返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
  4. newInstance     返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
  5. getType      Type指明返回的实例的类型。   
  6. 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 }

 

转载于:https://www.cnblogs.com/wangliyue/p/4422288.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值