最近在学设计模式,跑了大半个北京城,居然没能找到一本合适的讲设计模式的书-_-!很悲剧啊,如果谁能推荐本好书在下先谢过了(最好是用项目讲解的,这样更好理解)!不过这个不是主要问题,最近在看一个动软的基于接口的工厂模式的三层架构项目,很是不理解!之前了解的工厂模式都是在网上看的,感觉很杂,也很乱,到现在也没能里出的头绪(不系统学习的后果,汗!)。以我之前的理解,工厂模式并不能让开发变的更快,更好,反而有可能因此加打开发的成本,使之变的复杂化!工厂模式的优点在于代码的重用性,和接下来的可开发性(二次开发甚至多次开发),工厂的作用就是用来创建新类与新的接口(创建产品)因此使用工厂模式的架构其可扩展性就要比简单三层架构要强很多……我这样理解对吗?- -
    OK,下面进入正题,解决方案如下
其中web是表示层,这个层里调用bll(逻辑层)层里的方法,bll层里在调用Idal(数据访问接口层)中的IProduct接口里的方法,然后SQLServerDAL里的Produte类继承IProduct接口,所有针对数据库操作的方法体都些在这…这些都很好理解,不理解的地方在这:
namespace LiTianPing.BLL.Demo
{
    /// <summary>
    /// 业务逻辑类Product 的摘要说明。
    /// </summary>
    public class Product
    {
        private static readonly IProduct dal = DataAccess.CreateProduct();
        public Product()
        { }
这是bll层里的Product类,在这声明了一个静态的只读属性的接口IProduct,但是在这并不是用new直接声明的对象,而是调用工厂层里的DataAccess类中的CreateProduct()方法创建的!这个方法如下:
         /// <summary>
        /// 创建Product数据层接口
         /// </summary>
        public static LiTianPing.IDAL.Demo.IProduct CreateProduct()
        {
            string CacheKey = path + ".Demo.Product";
            object objType = CreateObject(path, CacheKey);
            return (IProduct)objType;
        }
该方法中调用了本类中的CreateObject方法,代码如下:
                  //使用缓存
private static object CreateObject(string path,string CacheKey)
{
object objType = DataCache.GetCache(CacheKey);
if (objType == null)
{
try
{
objType = Assembly.Load(path).CreateInstance(CacheKey);
DataCache.SetCache(CacheKey, objType);// 写入缓存
}
catch//(System.Exception ex)
{
//string str=ex.Message;// 记录错误日志
}
}
return objType;
}
到这我就彻底的不明白了,这个方法不是在用映射创建缓存吗?这个缓存和我创建创建Product数据层接口有什么关系?接口里的方法不都是直接写出来的吗?工厂模式不就是为了创建新的产品(类,接口)而存在的吗?在这为什么一点也看不出来是在创建产品呢?

解决方案 »

  1.   

    书嘛,《HeadFirst 设计模式》(《深入浅出设计模式》),写得挺好玩的
      

  2.   

    把对象保存到缓存,减少资源消耗。
    书可看看大话设计模式和head first设计模式
    再研究下petshop
      

  3.   

    创建实例后写到缓存中去,下次使用的时候先判断缓存中是否有该实例,如果有就直接从缓存中拿出来用,否则创建实例。
    书嘛,最近买了一本 《软件设计精要与模式》,结合.net framework里边的源码讲解,看了几章,觉得还可以。。
    LZ可以看一下。。
      

  4.   

    运用缓存,减少资源消耗。每次创建前都先检查缓存。
    ibatis中好像也是这么用的
      

  5.   

    工厂模式就是让子类去决定要生产什么对象,客户类只需要知道接口就行了,无需知道具体类的类型,如果使用new操作符那么必须知道具体产品的类型,显然是耦合了
    所以用工厂模式
    还有抽象工厂和工厂模式的目的是不一样的
      

  6.   

    楼上的解释我理解一部分,(在下不才,见谅)不理解的是我子类需要创建哪个对象不是也要在工厂中写出相应的方法吗?
    类似这样:
            /// <summary>
           /// 创建Product数据层接口
            /// </summary>
            public static LiTianPing.IDAL.Demo.IProduct CreateProduct()
            {
                string CacheKey = path + ".Demo.Product";
                object objType = CreateObject(path, CacheKey);
                return (IProduct)objType;
            }
    (关于这个方法还有个疑问,当子类中调用这个方法时到底创建的是demo下的Product类的对象还是创建的是IProduct接口的对象?)
    这样做为什么给人一种吧简单的东西变复杂的感觉?为什么要多这样一个步骤呢?
      

  7.   


    是创建的IProduct实现类的对象
      

  8.   

    Product是IProduct接口的实现类,这里用了DAO模式
      

  9.   

    DAO模式不是java用的吗……
    先不说这个了,您看我这样理解对不对:这个方法声明了返回值是一个IProduct接口的对象,所以在子类中这样写是没错的:private static readonly IProduct dal = DataAccess.CreateProduct();
    但是在方法里面调用CreateObject(path, CacheKey); 方法实际上是在创建Product类,也就是IProduct接口的实现类,并把这个对象赋值给了IProduct接口,所以最终返回的IProduct接口的对象同时也包括Product类的对象,这样理解对吗?- -
      

  10.   

    返回的是Product类的实例,表面上看客户端使用IProduct,但是实际是用IProduct接口引用Product类的实例,这是通过多态实现的
      

  11.   

    恩,这部分明白了,多谢Ricercar :) 您看我关于工厂这样的理解对吗:
    因为项目中逻辑层、数据访问层,有时还需要一个数据访问模块(多个不同数据库的情况下)的代码都是分开编写的,为了协调几个层之间的方法与方法所需要的参数(避免出现各自为战的局面),出现了数据访问接口层,需要写实现类的层继承我的接口,然后逻辑层直接调用我接口里的方法,但是接口是不能被实例化的,实例化接口实际上是创建接口实现类的对象,这样逻辑层实际上还是在调用实现类(一般是数据访问层)中的方法,于是为了创建接口实现类的对象就出现了工厂层:用于创建我所需要的对象;而且工厂中一般要用反射的方式创建所需类或接口的对象,不用关心对象内部的构造。
      

  12.   

    Product类是IProduct的实现类,
    可以看到有这个一行代码在SQLServeDAL里面:
    Public class Product:IProduct
    {
    ……
    }
    表明Product也是IProduct类型工厂的作用是决定实现类,至于用不用反射,那就不一定了!这里动易用的反射是为了方便向不同的数据库平台上迁移
      

  13.   

    http://cj723.cnblogs.com/
    大话设计模式楼主,您一定要看看这本书,这绝对是您的梦想,这是一本呕心沥血的典范,楼主,您一定要看看这本书
    楼主,您一定要看看这本书楼主,您一定要看看这本书楼主,您一定要看看这本书楼主,您一定要看看这本书
    楼主,您一定要看看这本书
    楼主,您一定要看看这本书

      

  14.   

    工厂模式可以和代理模式结合,在工厂中返回代理对象,如果直接用new是无法实现的
      

  15.   

    结贴了,大家说的都不错,考虑到Ricercar说的最多,最详细,分就给他了,谢谢大家的帮忙,剩下的就靠个人努力了