Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在多个平台上实现AdNetworks的抽象工厂模式_C#_Design Patterns_Unity3d - Fatal编程技术网

C# 在多个平台上实现AdNetworks的抽象工厂模式

C# 在多个平台上实现AdNetworks的抽象工厂模式,c#,design-patterns,unity3d,C#,Design Patterns,Unity3d,下面是github项目的关键 我想实现抽象工厂,而不是只在一个文件中添加依赖于平台的编译标志,并使其难看。因此,代码是解耦的。此外,我必须在不同的平台上实现不同的广告网络 这是接口 public interface IAds { void ShowVideoAd(); void PreLoadVideoAd(); bool IsAdAvailable(); } 所有平台控制器(Android、IOS、Amazon、Windows)都将实现此接口 public

下面是github项目的关键

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

这是接口

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

}
所有平台控制器(Android、IOS、Amazon、Windows)都将实现此接口

    public class AmazonAdsController : IAds
    {
// Code Goes here
    }
然后在某个工厂的课堂上我会做

此方法将从AdManager调用为单例行为。我当前的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
    }
}
名称空间MS.Ads
{
[请求组件(类型(密钥生成器))]
公共类管理员:MonoBehavior
{
#区域字段和属性
[序列化字段]
私有密钥源_密钥源;
[序列化字段]
[hideininstecpt]
私有字符串\u文件名;
[序列化字段]
[hideininstecpt]
私有字符串url;
//从何处获取密钥的源
公共密钥源
{
获取{return\u keysource;}
设置{u keysource=value;}
}
//从何处获取AdKey的Web URL
公共字符串URL
{
获取{return\u url;}
设置{uURL=value;}
}
//从何处获取adkey的文件名,例如adc.json
公共字符串文件名
{
获取{return\u fileName;}
设置{u fileName=value;}
}
//要替换为FactoryObject。
私人FyberController _FyberController;
#端区
#区域消息方法
void Start()
{            
GetComponent().GenerateKeys(源、URL、文件名);
_fyberController=新的fyberController();
_fyberController.RequestVideoAd();
}
#端区
#区域方法
公开无效ShowAd()
{
如果(_fyberController.IsVideoAdAvailable)
_fyberController.ShowVideoAd();
}
公共图书馆是可视的()
{
return _fyberController.IsVideoAdAvailable?true:false;
}
#端区
}
}
我想知道什么

  • 工厂模式是这里的正确选择吗
  • 如果是,我应该使用接口、抽象基类还是 具有虚拟方法的基类

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

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


    在本例中,您使用的是Factory方法模式。它比Abstract Factory模式更易于使用。

    如果
    GetObject
    中的ing看起来不好,它会使实现违反OCP原则-要添加新的提供程序,您必须重新编译项目。相反,依赖于从任何地方获取的外部参数,例如配置,并将该值与可能的提供者列表相匹配。我可以做的是创建不同的类WinowsAdsFactory来返回产品WindowsAdsController
    GetObject(RuntimePlatform,bool isAmazon=false)
    客户端将传递
    factoryProducer.GetObject(Application.platform)
    ,但我无法理解您所说的将值与可能的提供者列表相匹配是什么意思。因为即使我传递了这些参数,我也必须检查它们,尤其是在Android平台下的亚马逊。为什么这个问题会逐字出现在和上?那里使用的用户名是不同的(SamBh)@WiktorZychla可能是所有平台的枚举,并将其传递给GetObject函数。它有一个字典动作/对象
    字典
    字典
    @usamakaleem:是。如果您还公开了一个方法来向这个内部字典添加一个可能的新处理程序,那么您将拥有一个与OCP兼容的解决方案。关于第2点,在使用工厂方法时,我应该创建一个AbstractBaseFactory,为不同的平台创建单独的具体工厂,让他们创建他们的PlatformadController(产品),还是这样就可以了。正如我所解释的,如果你有一个工厂,现在就可以了。但是,如果你有独立的工厂,那么就选择另一种设计模式,即抽象工厂模式。
    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
        }
    }