一.工厂模式
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性
Demo:以协议为例
1.抽象接口
public interface IProtocolGateWay
{
string ProtocolType{ get; }
/// <summary>
/// 读取
/// </summary>
/// <returns></returns>
Dictonary<string,object> Read(Dictonary<string,object> parm);
/// <summary>
/// 控制
/// </summary>
Dictonary<string,object> Control(Dictonary<string,object> parm) ;
}
37226协议
public class ProtocolMeta376
{
public string ProtocolType => ProtocolType.P376;
/// <summary>
/// 读取
/// </summary>
/// <returns></returns>
public Dictonary<string,object> Read(Dictonary<string,object> parm)
{
Dictonary<string,object> result=new Dictonary<string,object>();
//todo
return result;
}
/// <summary>
/// 控制
/// </summary>
public Dictonary<string,object> Control(Dictonary<string,object> parm)
{
Dictonary<string,object> result=new Dictonary<string,object>();
//todo
return result;
}
}
62298 协议
public class ProtocolMeta698
{
public string ProtocolType => ProtocolType.P698;
/// <summary>
/// 读取
/// </summary>
/// <returns></returns>
public Dictonary<string,object> Read(Dictonary<string,object> parm)
{
Dictonary<string,object> result=new Dictonary<string,object>();
//todo
return result;
}
/// <summary>
/// 控制
/// </summary>
public Dictonary<string,object> Control(Dictonary<string,object> parm)
{
Dictonary<string,object> result=new Dictonary<string,object>();
//todo
return result;
}
}
创建一个工厂,生成基于给定信息的实体类的对象。
调用方法一:
public class ProtocolFactory
{
public static IProtocolGateWay GetFactory(string protocol)
{
IProtocolGateWay factory;
switch (protocol)
{
case ProtocolType.P376:
factory= new ProtocolMeta376();
break;
case ProtocolType.P698:
factory= new ProtocolMeta698();
break;
default:
{
throw new InvalidOperationException("暂未实现该协议");
break;
}
}
return factory;
}
}
ProtocolFactory.GetFactory(ProtocolType.P376).Read(入参);
///接口
[httppost("api/Protocol/Read")]
public ActionResult Read(Dictonary<string,object> parm)
{
var protocotolType=parm["protocolType"].toStr();
return ProtocolFactory.GetFactory(protocotolType).Read(parm);
}
调用方法二:利用注入的形式
public class ProtocotolControl
{
public IEnumerable<IProtocolGateWay> factorys
public ProtocotolControl(IEnumerable<IProtocolGateWay> _factorys){
factorys=_factorys;
}
///接口
[httppost("api/Protocol/Read")]
public ActionResult Read(Dictonary<string,object> parm)
{
var protocotolType=parm["protocolType"].toStr();
var obj= factorys.FirstOrDefault(s => s.ProtocolType== protocotolType);
return obj.Read(parm);
}
}