一.工厂模式
通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性
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>();//todoreturn result; }/// <summary>/// 控制/// </summary> public Dictonary<string,object> Control(Dictonary<string,object> parm){Dictonary<string,object> result=new Dictonary<string,object>();//todoreturn 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>();//todoreturn result; }/// <summary>/// 控制/// </summary> public Dictonary<string,object> Control(Dictonary<string,object> parm){Dictonary<string,object> result=new Dictonary<string,object>();//todoreturn 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> factoryspublic 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);}}