如何利用反射技术和配置文件实现简单工厂模式的解耦合?

棘手的问题:在使用简单工厂模式时,如果有对工厂类进行添加case或者修改实例化对象名等需求,需要重新修改和编写程序并进行编译,很不方便,类与类耦合性较强!

解决方法:可以使用反射,只需要对字符串进行修改即可进行实例化修改操作,实现解耦合。(依赖注入)

 反射的书写格式为:

首先:必须要有命名空间。

using System.Reflection;

其次:

Operation oper=(Operation)Assembly.Load(factoryName).CreateInstance(className);

这里的factoryName为所建项目的一个命名空间”,也称“名称空间。

这里的className为当前命名空间.要实例化的类名。

这样,我们就可以写好一个反射了。

配置文件:

借助配置文件可以实现通过文件修改从而达到属性修改的目的(这里的属性就是实例化的对象),真的是很好用啊!

以下就是配置文件的书写,有点类似map的key-value,具体实现原理还在学习!

所以,我们只需要修改文件信息即可达到实例化的目的!!

下面第二行语句表示读取配置文件。

程序集应用名称一定要写准确!!  

具体代码如下:

工厂类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;


namespace simpleFactory
{
    class SimpleFactoryPratice
    {
        private static readonly string factoryName = "simpleFactory";
        private static readonly string concreteType =ConfigurationSettings.AppSettings["Operation"];

        public static Operation creatFactory()
        {
            try
            {
                string className=factoryName+"."+concreteType;
                return (Operation)Assembly.Load(factoryName).CreateInstance(className);
            }catch(Exception e){
                Console.WriteLine(e.Message);
                return new OperationAdd();
            }
        }
    }
}

 配置文件:

必须要添加System.Configuration

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <appSettings>
  <add key="Operation" value="OperationAdd"/>
  </appSettings>
</configuration>

 操作接口类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace simpleFactory
{
    class Operation
    {
        private double _numberA = 0.0;
        private double _numberB = 0.0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }

    }
}   

加减乘除不具体展开了,这里只列举加的实现类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace simpleFactory
{
    class OperationAdd:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }

    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;

namespace simpleFactory
{
    class MainTest
    {
        public  static void Main(string[] args){
            try
            {
                Operation oper;
                oper = SimpleFactoryPratice.creatFactory();
                oper.NumberA = 12.0;
                oper.NumberB = 10.0;
                Console.WriteLine(oper.GetResult() + " ");
            }catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

    }
}

 

这也是比较麻烦的一个异常,本质上就是出现了null.method()的情况。。。。其实,就是oper是null。但是为什么呢?

答案:配置文件错了。配置文件我新定义了一个新的引用,框架代码不全。用默认引用就好了。

 

以上内容较为浅显,只是初探,本人仍在不断研究这其中奥秘!

如有不妥之处,欢迎指正。互相讨论,互相学习,互相进步!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值