美文网首页Java学习笔记
effective java学习笔记 原则1:考虑用静态工厂方法

effective java学习笔记 原则1:考虑用静态工厂方法

作者: 码农豹 | 来源:发表于2017-08-10 11:34 被阅读17次

原则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前三思静态工厂方法

相关文章

网友评论

    本文标题:effective java学习笔记 原则1:考虑用静态工厂方法

    本文链接:https://www.haomeiwen.com/subject/mlqhrxtx.html