private void initProvider()
    {
        Class clazz = PROVIDER.getValue();
        if ( clazz == null ) {
            if ( ClusterManager.isClusteringEnabled() ) {
                Log.debug("Clustering is enabled. Falling back to non-cached provider");
                clazz = DefaultPubSubPersistenceProvider.class;
            } else {
                clazz = CachingPubsubPersistenceProvider.class;
            }
        }

        // Check if we need to reset the provider class
        if (provider == null || !clazz.equals(provider.getClass()) ) {
            if ( provider != null ) {
                provider.shutdown();
                provider = null;
            }
            try {
                Log.info("Loading PubSub persistence provider: {}.", clazz);
                provider = (PubSubPersistenceProvider) clazz.newInstance();
                provider.initialize();
            }
            catch (Exception e) {
                Log.error("Error loading PubSub persistence provider: {}. Using default provider instead.", clazz, e);
                provider = new DefaultPubSubPersistenceProvider();
                provider.initialize();
            }
        }
    }
Instantiates a new instance.

It is not expected that there ever is more than one instance of the manager, as it's closely coupled to
{@link PubSubModule}. This constructor has 'package' access restrictions to reflect this.
xmppserver/src/main/java/org/jivesoftware/openfire/pubsub/PubSubPersistenceProviderManager.java