日期:2014-05-20  浏览次数:20762 次

关于工厂模式问题
小弟正在学习工厂模式。有个疑问一直想不通,或许是我钻牛角尖了。 
例如:接口类IUser中有4个方法,GetList(),Add(),Update(),Del() 
实体类User实现IUser接口,并在自己的实体类中添加了GetListByID(int id)方法。 
但通过看例子工厂模式返回的往往都是接口类IUser,那这样的话我就访问不到User类中的GetListByID(id)方法了。 
那该如何去解决这个问题? 
我有些困惑,请各位大虾们指点小弟一二。给我些思路,谢谢。

------解决方案--------------------
又发一帖...你这不是工厂模式的问题,而是接口设计的问题...IUser接口设计很粗陋,重构IUser才是正途...
------解决方案--------------------
探讨
那请问如果子类中有扩展方法该如何呢?
这是个例子,自然是很粗糙。
你能否给点建设性的意见?

------解决方案--------------------
给你个参考:
一、项目名称及描述:(实现步骤为:4-3-6-5-2-1)
1、WEB=表示层
2、BLL=业务逻辑层
3、IDAL=数据访问层接口定义
4、Model=业务实体
5、DALFactory=数据层的抽象工厂(创建反射)
6、SQLServerDAL=SQLServer数据访问层 / OracleDAL=Oracle数据访问层

DBUtility 数据库访问组件基础类

二、项目引用关系
1、Web 引用 BLL。
2、BLL 引用 IDAL,Model,使用DALFactory创建实例。
3、IDAL 引用 Model。
4、Model 无引用。
5、DALFactory 引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。
6、SQLServerDAL 引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。

 

三、实现步骤
1、
创建Model,实现业务实体。
2、
创建IDAL,实现接口。
3、
创建SQLServerDAL,实现接口里的方法。
4、
增加web.config里的配置信息,为SQLServerDAL的程序集。
5、
创建DALFactory,返回程序集的指定类的实例。
6、
创建BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法。
7、
创建WEB,调用BLL里的数据操作方法。

注意:
1、web.config里的程序集名称必须与SQLServerDAL里的输出程序集名称一致。
2、DALFactory里只需要一个DataAccess类,可以完成创建所有的程序集实例。
3、项目创建后,注意修改各项目的默认命名空间和程序集名称。
4、注意修改解决方案里的项目依赖。
5、注意在解决方案里增加各项目引用。
------解决方案--------------------
学习模式可以帮助我们在需要他的时候能想起来使用模式,而不是为了时髦而使用模式,你得首先明白工厂模式的真正用意。你举的这个例子似乎不太适合工厂模式吧,而且你也并没有体现出工厂模式,没有面向对象的感觉。只是个接口编程而已,向楼上的兄台说的那样,实体类中添加了GetListByID方法之后,违背了里氏代换原则,也就是说这样设计已经不合理了