Abstract factory pattern for implementing AdNetworks on multiple platforms Here's the link to the github project. 

I want to implement abstract factory instead of adding platform-dependent compilation flags in just one file and make it ugly, hence decoupled code. Moreover, I have to implement different AdNetworks on different platforms.

This is the interface:

public interface IAds 
{
    void ShowVideoAd();
    void PreLoadVideoAd();
    bool IsAdAvailable();

}


And all the PlatformAdController (Android, IOS, Amazon, Windows) will implement this interface:

    public class AmazonAdsController : IAds
    {
// Code Goes here
    }


Then in someFactoryClass I'll do:

public IAds GetObject()
{
    #if UNITY_Android
    if(platform == Amazon)
    return new AmazonAdsController
    else 
    return new AndroidAdsController
    #elif UNITY_IOS
    return new IOSAdsController
    #elif UNITY_WP10
    return new WindowsAdsController
}


This method will be called from AdManager a singleton MonoBehaviour. My current AdManager state is:

namespace MS.Ads
{
    [RequireComponent(typeof(KeyGenerator))]
    public class AdManager : MonoBehaviour
    {
        #region Fields &amp; Properties
        [SerializeField]
        private KeysSource _keysSource;
        [SerializeField]
        [HideInInspector]
        private string _fileName;
        [SerializeField]
        [HideInInspector]
        private string _url;

        // Source from where to get keys
        public KeysSource Source
        {
            get { return _keysSource; }
            set { _keysSource = value; }
        }

        // Web URL from where to get AdKeys
        public string URL
        {
            get { return _url; }
            set { _url = value; }
        }

        // FileName from where to get Adkeys e.g adc.json
        public string FileName
        {
            get { return _fileName; }
            set { _fileName = value; }
        }

        // To be replaced by a FactoryObject.
        private FyberController _fyberController;
        #endregion

        #region Message Methods
        void Start()
        {            
            GetComponent&lt;KeyGenerator&gt;().GenerateKeys(Source, URL, FileName);
            _fyberController = new FyberController();
            _fyberController.RequestVideoAd();
        }
        #endregion

        #region Methods
        public void ShowAd()
        {
            if (_fyberController.IsVideoAdAvailable)
                _fyberController.ShowVideoAd();
        }

        public bool IsVideoAdAvailable()
        {
            return _fyberController.IsVideoAdAvailable ? true : false;
        }
        #endregion
    }
}


What I would like to know:


Is factory pattern the right choice here?
If yes, should I go with an interface or an abstract base class or a base class with virtual methods?
It looks a lot like some service with platform dependent implementation. You might use a dependency injection pattern or service locator pattern.


I think factory is not quite great as a solution cause you will not create different implementations in a single application run. Also that is not great if you need this Controller to be created only once.


While it depends directly on your implementations and functionality of this service I will go with some interface. Further if implementations share same code then you might use an abstract base class to put that part of logic in it.