原则1:考虑用静态工厂方法代替公有构造器
-
提供实例的方式:
- 静态工厂方法(非设计模式中的静态工厂模式)
- 公有构造器new
-
静态工厂方法的优势
- 能表明返回值含义的方法名称:如new BigInteger(int,int,random),BigInteger.probablePrime(),两者都是大概率返回一个素数,但是公有构造器的方式无法表明返回值的类型
- 减少实例的创建:如Boolean.valueof,Long.valueof(-128<= x< =128)都会缓存常用对象,提升性能
- 返回值类型可以是子类:公有构造器凡是返回类型只能是一种,静态工厂方式返回子类,在代码升级时,返回的子类更改成更高性能的子类,用户无感知。
- 适合基于接口的框架:Collections,ElumSet,服务提供者框架
-
服务提供者框架
- 理解:以应用市场为例,一个公司提供通过应用市场向用户提供某个APP,在此框架中,存在服务接口,具体服务,服务提供者接口,具体服务提供者,服务管理者,分别对应app接口,具体某个APP:A,公司接入应用市场接口,公司B,应用市场。公司B要向用户提供A这个服务,但用户不会直接通过公司B去获取这项服务,而是通过平台,那么平台就规定,要提供服务必须按照我的平台标准接口来接入,服务A要实现服务接口,公司B要实现服务提供者接口,so当用户搜索某个服务时,平台找到对应的服务提供者并返回其服务。用户不用担心多种服务使用方式不一致,平台强制了公司B按服务接口和服务提供者接口提供服务,确保了用户可直接按服务接口定义的方式去使用服务,所有服务使用方式一致;
- 组成:IService,ConcreteSerVice,IProvider,ConcreteProvider,ProviderManager(platform)
public class main {
public static void main(String[] args) {
ServicePlatform.registerProvider(new LoginProvider());
IService service = ServicePlatform.getService("login");
service.startService();
service.stopService();
Long long1 = Long.valueOf(1);
System.out.println(long1);
}
}
public interface IService {
void startService();
void stopService();
}
public class LoginService implements IService {
@Override
public void startService() {
System.out.println("start login sercice");
}
@Override
public void stopService() {
System.out.println("stop login service");
}
}
public interface IServiceProvider {
IService getService();
String getServiceName();
}
public class LoginProvider implements IServiceProvider {
@Override
public IService getService() {
return new LoginService();
}
@Override
public String getServiceName() {
return "login";
}
}
public class ServicePlatform {
private static Map<String, IServiceProvider> map = new HashMap<>();
public static void registerProvider(IServiceProvider provider) {
if (!map.containsKey(provider.getServiceName())) {
map.put(provider.getServiceName(), provider);
}
}
public static IService getService(String name) {
return map.get(name).getService();
}
}
- 总结:new前三思静态工厂方法