棘手的问题:在使用简单工厂模式时,如果有对工厂类进行添加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。但是为什么呢?
答案:配置文件错了。配置文件我新定义了一个新的引用,框架代码不全。用默认引用就好了。
以上内容较为浅显,只是初探,本人仍在不断研究这其中奥秘!
如有不妥之处,欢迎指正。互相讨论,互相学习,互相进步!