@Override
    public Object newClient(ClientBuilderParams params) {
        if (isClosing()) {
            throw new IllegalStateException("Cannot create a client because the factory is closing.");
        }
        validateParams(params);
        final Scheme scheme = params.scheme();
        final Class<?> clientType = params.clientType();
        for (ClientFactory factory : clientFactories.get(scheme)) {
            if (factory.isClientTypeSupported(clientType)) {
                return factory.newClient(params);
            }
        }
        // Since we passed validation, there should have been at least 1 factory for this scheme,
        // but for some reason none of these passed the filter.
        throw new IllegalStateException(
                "No ClientFactory for scheme: " + scheme + " matched clientType: " + clientType);
    }
A {@link ClientFactory} which combines all discovered {@link ClientFactory} implementations.

<h2>How are the {@link ClientFactory}s discovered?</h2>

<p>{@link DefaultClientFactory} looks up the {@link ClientFactoryProvider}s available in the current JVM
using Java SPI (Service Provider Interface). The {@link ClientFactoryProvider} implementations will create
the {@link ClientFactory} implementations.
core/src/main/java/com/linecorp/armeria/client/DefaultClientFactory.java