c# - 用于在多个平台上实现 AdNetworks 的抽象工厂模式

标签 c# design-patterns unity3d

这是 link到github项目。

我想实现抽象工厂,而不是只在一个文件中添加依赖于平台的编译标志并使其变得丑陋。因此解耦代码。此外,我必须在不同的平台上实现不同的广告网络。

这是界面

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

}

所有的PlatformAdController(Android, IOS, Amazon, Windows)都会实现这个接口(interface)。

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

然后在someFactoryClass我会做

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
}

此方法将从 AdManager 的单例 MonoBehaviour 中调用。我当前的 AdManager 状态是

namespace MS.Ads
{
    [RequireComponent(typeof(KeyGenerator))]
    public class AdManager : MonoBehaviour
    {
        #region Fields & 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<KeyGenerator>().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
    }
}

我想知道的

  1. 工厂模式是这里的正确选择吗?
  2. 如果是,我应该使用接口(interface)、抽象基类还是 具有虚方法的基类?

最佳答案

1- 是的,你可以在这里使用工厂模式,你完全可以接受。明天如果您有另一个广告,您可以轻松地将其添加到工厂。

2- 有两种创建工厂模式的方法。 抽象工厂模式通过组合将对象实例化的责任委托(delegate)给另一个对象,工厂方法模式使用继承并依赖子类来处理所需的对象实例化。这取决于您的需求。

在这种情况下,您使用的是工厂方法模式。它比抽象工厂模式更易于使用。

关于c# - 用于在多个平台上实现 AdNetworks 的抽象工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244375/

相关文章:

c# - 无法序列化 DataTable。未设置数据表名称

c# - 带锁的单例属性如何保证线程安全?

unity3d - 在Unity中设置Google Play游戏时,我不断收到无效的类名:发现歧义匹配错误

c# - 在 Unity 运行时删除重复的顶点

c# - 如何始终根据我的轴方向移动我的对象?

c# - 如何判断文件是否已下载?

c# - 如何测试 wpf gui 线程是否处于事件状态

c# - 有没有办法通过隐藏面板或扩展器使用虚拟化?

用于操作 DOM API 的 Javascript 设计模式

java - 如何解析以树形组织的数据?