class InternalCacheBuilder {

  public InternalCache create()
      throws TimeoutException, CacheWriterException, GatewayException, RegionExistsException {
    synchronized (InternalCacheBuilder.class) {
      InternalDistributedSystem internalDistributedSystem = findInternalDistributedSystem()
          .orElseGet(this::createInternalDistributedSystem);
      return create(internalDistributedSystem);
    }
  }

  public  InternalCacheBuilder();
  public  InternalCacheBuilder(Properties configProperties);
  public  InternalCacheBuilder(CacheConfig cacheConfig);
  private  InternalCacheBuilder(Properties configProperties, CacheConfig cacheConfig);
  @VisibleForTesting  InternalCacheBuilder(Properties configProperties,
      CacheConfig cacheConfig,
      MetricsService.Builder metricsSessionBuilder,
      Supplier<InternalDistributedSystem> singletonSystemSupplier,
      InternalDistributedSystemConstructor internalDistributedSystemConstructor,
      Supplier<InternalCache> singletonCacheSupplier,
      InternalCacheConstructor internalCacheConstructor);

}