当前位置: 首页 > news >正文

vs2013网站开发教程吴江盛泽建设局网站

vs2013网站开发教程,吴江盛泽建设局网站,18末年禁止3000部在线,树状wordpress主题简单工厂模式虽然简单#xff0c;但是存在一个很严重的问题#xff1a;由于静态工厂方法是根据传入的参数不同来创建不同的产品的#xff0c;所以当系统中需要引入新产品时#xff0c;就需要修改工厂类的源代码#xff0c;这将违背开闭原则。为了实现增加新产品而不修改原… 简单工厂模式虽然简单但是存在一个很严重的问题由于静态工厂方法是根据传入的参数不同来创建不同的产品的所以当系统中需要引入新产品时就需要修改工厂类的源代码这将违背开闭原则。为了实现增加新产品而不修改原有代码工厂方法模式应运而生。一、日志记录器的设计A科技公司欲开发一个系统运行日志记录器(Logger)该记录器可以通过多种途径保存系统的运行日志例如通过文件或数据库记录用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时A科技公司的开发人员发现需要对日志记录器进行一些初始化工作初始化参数的设置过程较为复杂而且某些参数的设置有严格的先后次序否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是A科技公司开发人员面临的一个难题。开发人员对需求进行分析发现该日志记录器有如下两个设计要点需要封装日志记录器的初始化过程这些初始化工作比较复杂。比如需要初始化其它相关的类还有可能需要配置工作环境(如连接数据库或创建文件)导致代码较长如果将他们都写在构造函数中会导致构造函数庞大不利于代码的修改和维护。用户可能需要更换日志记录方式在客户端代码中需要提供一种灵活的方式来选择日志记录器尽量在不修改源代码的基础上更换或增加日志记录方式。开发人员最开始使用简单工厂模式对日志记录器进行了设计结构图如下LoggerFactory 充当创建日志记录器的工厂CreateLogger() 负责创建日志记录日ILogger 是抽象日志记录器的接口FileLogger 和 DatabaseLogger 是具体的日志记录器。工厂类 LoggerFactory 的代码如下    public class LoggerFactory{public static ILogger CreateLogger(string args){ILogger logger  null;if (args.Equals(db, StringComparison.OrdinalIgnoreCase)){//连接数据库代码省略//创建数据库日志记录器对象logger  new DatabaseLogger();//初始化数据库日志记录器代码省略}else if (args.Equals(file, StringComparison.OrdinalIgnoreCase)){//创建日志文件代码省略//创建文件日志记录器队形logger  new FileLogger();//初始化文件日志记录器代码省略}return logger;}} 虽然从上边的代码可以看出简单工厂模式实现了对象的创建和使用分离但是仍然存在两个问题工厂类过于庞大而且包含了大量的 if...else... 代码导致维护和测试难度增大。系统的扩展不灵活如果要增加新的日志记录器必须修改静态工厂方法的业务逻辑违反了开闭原则。工厂方法模式的动机之一就是为了解决以上两个问题。二、工厂方法模式概述在简单工厂模式中只提供一个工厂类这个工厂类处于实例化产品类的中心位置他需要知道每个产品类的创建细节并决定在何时实例化哪一个产品类。简单工厂最大的缺点就是每当有新的产品要加入系统的时候就必须修改工厂类在静态工厂方法中添加新产品的业务逻辑这就违反了开闭原则。另外简单工厂模式中所有产品的创建都由同一个工厂类负责工厂类的职责过于繁重业务逻辑较为复杂具体产品和工厂类之间的耦合度较高严重影响了系统的扩展性和灵活性。工厂方法模式刚好就解决了这一点。工厂方法模式不再提供一个统一的工厂类来创建所有的产品对象而是针对不同的产品提供不同的工厂系统提供一个与产品等级结构对应的工厂等级结构。定义如下工厂方法模式Factory Method Pattern定义一个用于创建对象的接口让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式Factory Patter又可称作虚拟构造器模式Virtual Constructor Pattern或多态工厂模式Polymorphic Factory Pattern。工厂方法模式是一种类创建型模式。工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法而由其子类来具体实现工厂方法创建具体的产品对象。结构图如下从上图可以看出工厂方法模式包含以下4个角色IProduct(抽象产品)它是定义产品的接口是工厂方法模式所创建对象的超类型也就是产品对象的公共父类。ConreteProduct(具体产品)它实现了抽象产品的接口某种类型的具体产品由专门的具体工厂创建具体工厂和具体产品之间一一对应。IFactory(抽象工厂)在抽象工厂类中声明了工厂方法Factory Method用于返回一个产品。抽象工厂是工厂方法模式的核心所有创建对象的工厂类都必须实现该接口。ConreteFactory(具体工厂)它是抽象工厂的子类实现了抽象工厂中定义的工厂方法并可由客户端调用返回一个具体产品类的实例。与简单工厂模式相比工厂方法模式的主要区别就是引入了抽象工厂角色。**抽象工厂可以是接口、抽象类或具体类。**典型代码如下public interface IFactory{IProduct FactoryMethod(); } 抽象工厂中声明了工厂方法但并未实现工厂方法具体产品对象的创建由其子类负责。客户端针对抽象工厂编程可以在运行时再指定具体工厂类。不同的具体工厂类可以创建不同的具体产品。public class ConcreteFactory : IFactory{public IProduct FactoryMethod(){return new ConcreteProduct} } 具体工厂类除了创建具体产品对象之外还可以负责产品对象的初始化工作以及一些资源和环境配置工比如连接数据库、创建文件等。三、完整的解决方案开发人员决定是使用工厂方法模式来设计日志记录器基本结构如图ILogger 充当抽象产品其子类 FileLogger 、DatabaseLogger 是具体产品。ILoggerFactory 充当抽象工厂FileLoggerFactory、DatabaseLoggerFactory 充当具体工厂。完整代码如下    /// summary/// 日志记录器接口抽象产品/// /summarypublic interface ILogger{void WriteLog();}/// summary/// 文件日志记录器具体产品/// /summarypublic class FileLogger : ILogger{public void WriteLog(){Console.WriteLine(文件日志记录);}}/// summary/// 数据库日志记录器具体产品/// /summarypublic class DatabaseLogger : ILogger{public void WriteLog(){Console.WriteLine(数据库日志记录);}}/// summary/// 日志记录器工厂接口抽象工厂/// /summarypublic interface ILoggerFactory{ILogger CreateLogger();}/// summary/// 文件日志记录器工厂类具体工厂/// /summarypublic class FileLoggerFactory : ILoggerFactory{public ILogger CreateLogger(){//创建文件日志记录器对象var logger  new FileLogger();//创建文件省略代码return logger;}}/// summary/// 数据库日志记录器工厂类具体工厂/// /summarypublic class DatabaseLoggerFactory : ILoggerFactory{public ILogger CreateLogger(){//连接数据库代码省略//创建数据库日志记录器对象var logger  new DatabaseLogger();//初始化数据库日志记录器代码省略return logger;}} 客户端测试代码    class Program{static void Main(string[] args){var factory  new FileLoggerFactory();//可引入配置文件实现var logger  factory.CreateLogger();logger.WriteLog();}} 输出四、反射与配置文件目前来说代码还存在一些问题就是如果客户端要更换具体的日志记录器就需要修改客户端的具体日志记录器工厂类的创建这一点上来说违背了开闭原则。为了让系统具有更好的灵活性和可扩展性开发人员决定对日志记录器客户端代码进行重构希望最终可以达到在不修改客户端任何代码的情况下更换或增加新的日志记录方式。在客户端代码中将不再使用 new 关键字来创建工厂对象而是将具体工厂类的类名存储在配置文件中比如XML中通过读取配置文件获取工厂类的类名字符串然后再借助 .NET 的反射机制根据类名字符串生成对象。1.反射有这么一句话 反射反射程序员的快乐 由此可见反射在开发中有着举足轻重的地位在很多框架中都可以看到它的身影。反射的定义反射是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制包括类的方法、属性、父类等信息还包括实例的创建和实例类型的判断等。2.实现创建配置文件 App.config?xml version1.0 encodingutf-8 ? configurationappSettings!--value为具体工厂类的完全限定名(命名空间类名)--add keyLoggerFactory valueLXP.DesignPattern.FactoryMethod.v2.FileLoggerFactory//appSettings /configuration 创建一个配置文件的帮助类 AppConfigHelper 代码如下    /// summary/// 配置文件帮助类/// /summarypublic class AppConfigHelper{/// summary/// 获取具体日志工厂方法/// /summary/// returns/returnspublic static object GetLoggerFactory(){try{var loggerFactoryName  ConfigurationManager.AppSettings[LoggerFactory];var type  Type.GetType(loggerFactoryName);return type  null ? null : Activator.CreateInstance(type);}catch (Exception ex){Console.WriteLine(ex.Message);}return null;}} 客户端测试代码    class Program{static void Main(string[] args){//var factory  new FileLoggerFactory();//可引入配置文件实现var factory  (ILoggerFactory) AppConfigHelper.GetLoggerFactory();var logger  factory.CreateLogger();logger.WriteLog();}} 后期如果要新增一个日志记录器就创建一个具体的日志记录器(需要实现ILogger接口)然后新增一个具体的日志记录器的工厂类然后将该工厂类的完全限定名(命名空间类名)替换配置文件中原有工厂类类名字符串即可。原有类库代码和客户端无需做任何修改完全符合开闭原则。3.补充.NET 中反射有多种方法1.如果要反射一个 DLL 中的类并且程序并没有引用该 DLL即对该程序来说这个DLL中的类是一个未知的类型可通过以下方法Assembly assembly  Assembly.LoadFile(程序集路径不能是相对路径); // 加载程序集EXE 或 DLL  object obj  assembly.CreateInstance(类的完全限定名即包括命名空间); // 创建类的实例 2.如果要反射当前项目中的类//方法1 Assembly assembly  Assembly.GetExecutingAssembly(); // 获取当前程序集  object obj  assembly.CreateInstance(类的完全限定名(命名空间  类名)); // 创建类的实例返回为 object 类型需要强制类型转换//方法2 Type type  Type.GetType(类的完全限定名(命名空间  类名));  object obj  type.Assembly.CreateInstance(type); //方法3 Type type  Type.GetType(类的完全限定名(命名空间  类名));  object obj  Activator.CreateInstance(type);  详情的使用这里就不展开了大家可以自行搜索。五、工厂方法的隐藏有时候为了进一步简化客户端的使用还可以对客户端隐藏工厂方法。此时在工厂类中将直接调用产品类的业务方法客户端无需调用工厂方法创建具体的产品直接通过工厂即可使用所创建的对象中的业务方法。这时需要需要将原来的工厂接口改为抽象工厂类在抽象类中添加一个方法在该方法中创建了具体的产品并调用产品的业务方法。具体代码如下    /// summary/// 将工厂接口改为抽象类/// /summarypublic abstract class LoggerFactory{/// summary/// 在工厂类中直接调用日志记录器类的业务方法 WriteLog()/// /summarypublic void WriteLog(){var logger  this.CreateLogger();logger.WriteLog();}public abstract ILogger CreateLogger();} 具体的工厂类需要将实现 ILoggerFactory 修改为继承抽象类 LoggerFactory 。客户端代码修改    class Program{static void Main(string[] args){var factory  (ILoggerFactory) AppConfigHelper.GetLoggerFactory();factory.WriteLog();//直接使用工厂对象来调用产品对象的业务方法}} 六、工厂方法模式总结既继承了简单工厂模式的优点又弥补了简单工厂模式的不足。工厂方法模式是使用频率最高的设计模式之一。1.主要优点工厂方法用来创建客户所需要的产品同时还向客户隐藏了哪种具体产品类将被实例化这一细节。用户只需要关心所需产品对应的工厂无须关心创建细节甚至无须知道具体产品类的类名。在系统中加入新产品时无须修改抽象工厂和抽象产品提供的接口无须修改客户端也无须修改其它的具体工厂和具体产品只要添加一个具体工厂和具体产品就可以了。这样系统的可扩展性也就变的非常好完全符合开闭原则。2.主要缺点在添加新产品时需要编写新的具体产品类而且还要提供与之对应的具体工厂类系统中的类的个数将成对增加在一定程度上增加了系统的复杂度有更多的类需要编译和运行会给系统带来一些额外的开销。由于考虑到系统的可扩展性需要引入抽象层在客户端代码中均使用抽象层进行定义增加了系统的抽象性和理解难度且在实现时可能需要用到DOM、反射等技术增加了系统的实现难度。3.适用场景客户端不知道其所需要的对象的类。在工厂方法模式中客户端不需要知道具体的产品类的类名只需要知道所对应的工厂即可具体的产品对象由具体工厂类创建可将具体工厂类的类名存储在配置文件中或数据库中。抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中抽象工厂类只需要提供一个创建产品的接口而由其子类来确定具体要创建的对象利用面向对象的多态性和里氏替换原则在程序运行时子类对象将覆盖父类对象从而使得系统更容易扩展。示例代码https://github.com/crazyliuxp/DesignPattern.Simples.CSharp参考资料
http://www.pierceye.com/news/892440/

相关文章:

  • 运城市住房与城乡建设局网站郑州百姓网招聘
  • 网站调用网页怎么做重庆手机网站方案设计
  • 购物 网站建设的市场分析泰兴网站建设吧
  • 企业网站代运营微信网页登录wordpress
  • 专业网站制作流程深圳市 网站建设450
  • 怎么做加盟网站海南网站搭建外包
  • 没有网站可以做落地页网站体验方案
  • 重庆便宜做网站的网站内容注意事项
  • 温岭手机网站建设企业网站建设遵循的原则
  • 美丽乡村 村级网站建设wordpress地图主题
  • 做双语网站多少钱建立设计网站富阳
  • 为什么有网网站打不开怎么回事网站怎样添加友情链接
  • 中国五码一级做爰网站wordpress去掉评论注册
  • 网站备案修改域名贵阳仿站定制模板建站
  • 渭南 网站集约化建设淘宝网站开发技术名称
  • 临沂做网站费用wordpress新浪微博图床插件
  • 游戏网站建设收费明细WordPress 中英文翻译
  • 如何建设一个企业网站wordpress底部导航代码
  • 公司网站页面设计思路互联网家装公司
  • 网站文字源码网上购物商城源代码
  • 彩票网站做一级代理犯法吗购物网站开发设计类图
  • 固镇做网站多少钱乐清网络公司哪家好
  • 绿色农业网站模板做网站有什么比较好看的动效
  • 百度aipage智能建站系统wordpress打印代码
  • 深圳招聘官网深圳搜索引擎优化推广便宜
  • 创建网站大约9377传奇
  • 单页面网站可以做自适应网站吗建筑设计培训
  • 做海报可以在哪些网站下载素材一键生成装修效果图app
  • 福田区住房和建设局官方网站wordpress仿凡客商城主题
  • 做下载网站用什么程序好深圳公司注册服务