工厂方法模式是为了解决简单工厂模式,因对象增加,需修改工厂类,违反了开闭原则还出现了工厂方法模式。现在随着反射技术的应用也完全解决了这个问题。
工厂方法模式 是通过“子类化”来 解决创建类的变化。
通过“配置信息+反射”也确实可以 解决创建类的变化,这种做法在.NET一些项目中也很常用。
这两种其实各有各的用武之地,难有A取代B的定论。不过反射的动态机制确实在某些场合更为灵活,但是它有着类型不安全的隐患。
结论:
工厂方法模式,优点:标准、规范。缺点:增加了不少类。
配置信息+反射,优点:规范、代码量少。缺点:存在类型的不安全性
1public class DataAccessHelper {
2 public static DataAccess GetDataAccess(string objectName) {
3 string dataAccessStringType = ConfigurationManager.AppSettings["aspnet_staterKits_TimeTracker_DataAccessLayerType" + objectName];
4 if (String.IsNullOrEmpty(dataAccessStringType)) {
5 throw (new NullReferenceException("ConnectionString configuration is missing from you web.config. It should contain <connectionStrings> <add key=\"aspnet_staterKits_TimeTracker\" value=\"Server=(local);Integrated Security=True;Database=Issue_Tracker\" </connectionStrings>"));
6 }
7 else {
8 Type dataAccessType = Type.GetType(dataAccessStringType);
9 if (dataAccessType == null) {
10 throw (new NullReferenceException("DataAccessType can not be found"));
11 }
12 Type tp = Type.GetType("ASPNET.StarterKit.DataAccessLayer.DataAccess");
13 if (!tp.IsAssignableFrom(dataAccessType)) {
14 throw (new ArgumentException("DataAccessType does not inherits from ASPNET.StarterKit.DataAccessLayer.DataAccess "));
15
16 }
17 DataAccess dc = (DataAccess)Activator.CreateInstance(dataAccessType);
18 return (dc);
19 }
20 }
21 }
2 public static DataAccess GetDataAccess(string objectName) {
3 string dataAccessStringType = ConfigurationManager.AppSettings["aspnet_staterKits_TimeTracker_DataAccessLayerType" + objectName];
4 if (String.IsNullOrEmpty(dataAccessStringType)) {
5 throw (new NullReferenceException("ConnectionString configuration is missing from you web.config. It should contain <connectionStrings> <add key=\"aspnet_staterKits_TimeTracker\" value=\"Server=(local);Integrated Security=True;Database=Issue_Tracker\" </connectionStrings>"));
6 }
7 else {
8 Type dataAccessType = Type.GetType(dataAccessStringType);
9 if (dataAccessType == null) {
10 throw (new NullReferenceException("DataAccessType can not be found"));
11 }
12 Type tp = Type.GetType("ASPNET.StarterKit.DataAccessLayer.DataAccess");
13 if (!tp.IsAssignableFrom(dataAccessType)) {
14 throw (new ArgumentException("DataAccessType does not inherits from ASPNET.StarterKit.DataAccessLayer.DataAccess "));
15
16 }
17 DataAccess dc = (DataAccess)Activator.CreateInstance(dataAccessType);
18 return (dc);
19 }
20 }
21 }
工厂方法模式 是通过“子类化”来 解决创建类的变化。
通过“配置信息+反射”也确实可以 解决创建类的变化,这种做法在.NET一些项目中也很常用。
这两种其实各有各的用武之地,难有A取代B的定论。不过反射的动态机制确实在某些场合更为灵活,但是它有着类型不安全的隐患。
结论:
工厂方法模式,优点:标准、规范。缺点:增加了不少类。
配置信息+反射,优点:规范、代码量少。缺点:存在类型的不安全性