首页 新闻 会员 周边 捐助

C#小问题:定义一个基类

0
悬赏园豆:10 [已关闭问题] 关闭于 2017-05-18 12:33
public class ServicesFactory<TInterface, TClass>
          where TInterface : class
          where TClass : TInterface
    {
        private static TInterface _instance;
        public static TInterface Instance
        {
            get
            {
                TInterface instanceTmp = Activator.CreateInstance<TClass>();
                if (_instance == null || _instance.GetType().FullName != instanceTmp.GetType().FullName)
                {
                    _instance = instanceTmp;
                }
                return _instance;
            }
        }
    }
名字什么都是浮云的主页 名字什么都是浮云 | 菜鸟二级 | 园豆:327
提问于:2017-04-26 13:05
< >
分享
所有回答(2)
0

你这个代码是干什么用的?ioc也不像,单例也不是。

Daniel Cai | 园豆:10424 (专家六级) | 2017-04-26 13:50

既使用泛型注入的方式使用了工厂模式的思想、也实现了单例

支持(0) 反对(0) 名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2017-04-27 09:57

@放飞吧,梦想!: 

你说的貌似没一个符合。这个不是注入,不是工厂,连单例实现的也是有问题的。

注入解决的是依赖,但你这边调用时候还是会出现对接口实现对象的依赖。

工厂缺少抽象产品,打到顶了也就勉强算个简单工厂

单例上未做确保,可能会实例化出来多个对象

 

针对你的这种场景建议直接使用现成的ioc框架,比如ms自己的unity。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-04-27 10:51

@Daniel Cai: 也行你说的对,但是通过调试来看确实实现了接口分离、对象实例化单一,而且支持种多接口调用的方便。你可以交互执行一下,对于我认为来说:接口就是协议。为什么不用抽象类,这个原因显而易见的。目的本身就是不允许继承的

支持(0) 反对(0) 名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2017-04-27 11:54

@Daniel Cai: 希望你能让我明白

支持(0) 反对(0) 名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2017-04-27 11:56

@放飞吧,梦想!:我没说要用抽象类。我的意思是工厂不是简单的template方法,这个和抽象类是两码事。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2017-04-28 18:47
0

这样做会带来一些困扰:假如 ClassA和ClassB都实现了IInterface接口,那么:

var a=WStockFactory<IInterface>.GetInstance<ClassA>();//将获得ClassA的实例;

紧接着

var b=WStockFactory<IInterface>.GetInstance<ClassB>();//仍然会获得ClassA的实例;

也就是说 a==b; 那我显式的去GetInstance<ClassB>就毫无意义,并且容易产生误导。

为森 | 园豆:579 (小虾三级) | 2017-04-30 02:33

对对,你说的对,我要改进下

 

支持(0) 反对(0) 名字什么都是浮云 | 园豆:327 (菜鸟二级) | 2017-05-02 09:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册