最近在学设计模式,跑了大半个北京城,居然没能找到一本合适的讲设计模式的书-_-!很悲剧啊,如果谁能推荐本好书在下先谢过了(最好是用项目讲解的,这样更好理解)!不过这个不是主要问题,最近在看一个动软的基于接口的工厂模式的三层架构项目,很是不理解!之前了解的工厂模式都是在网上看的,感觉很杂,也很乱,到现在也没能里出的头绪(不系统学习的后果,汗!)。以我之前的理解,工厂模式并不能让开发变的更快,更好,反而有可能因此加打开发的成本,使之变的复杂化!工厂模式的优点在于代码的重用性,和接下来的可开发性(二次开发甚至多次开发),工厂的作用就是用来创建新类与新的接口(创建产品)因此使用工厂模式的架构其可扩展性就要比简单三层架构要强很多……我这样理解对吗?- -
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数据层接口有什么关系?接口里的方法不都是直接写出来的吗?工厂模式不就是为了创建新的产品(类,接口)而存在的吗?在这为什么一点也看不出来是在创建产品呢?
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数据层接口有什么关系?接口里的方法不都是直接写出来的吗?工厂模式不就是为了创建新的产品(类,接口)而存在的吗?在这为什么一点也看不出来是在创建产品呢?
书可看看大话设计模式和head first设计模式
再研究下petshop
书嘛,最近买了一本 《软件设计精要与模式》,结合.net framework里边的源码讲解,看了几章,觉得还可以。。
LZ可以看一下。。
ibatis中好像也是这么用的
所以用工厂模式
还有抽象工厂和工厂模式的目的是不一样的
类似这样:
/// <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接口的对象?)
这样做为什么给人一种吧简单的东西变复杂的感觉?为什么要多这样一个步骤呢?
是创建的IProduct实现类的对象
先不说这个了,您看我这样理解对不对:这个方法声明了返回值是一个IProduct接口的对象,所以在子类中这样写是没错的:private static readonly IProduct dal = DataAccess.CreateProduct();
但是在方法里面调用CreateObject(path, CacheKey); 方法实际上是在创建Product类,也就是IProduct接口的实现类,并把这个对象赋值给了IProduct接口,所以最终返回的IProduct接口的对象同时也包括Product类的对象,这样理解对吗?- -
因为项目中逻辑层、数据访问层,有时还需要一个数据访问模块(多个不同数据库的情况下)的代码都是分开编写的,为了协调几个层之间的方法与方法所需要的参数(避免出现各自为战的局面),出现了数据访问接口层,需要写实现类的层继承我的接口,然后逻辑层直接调用我接口里的方法,但是接口是不能被实例化的,实例化接口实际上是创建接口实现类的对象,这样逻辑层实际上还是在调用实现类(一般是数据访问层)中的方法,于是为了创建接口实现类的对象就出现了工厂层:用于创建我所需要的对象;而且工厂中一般要用反射的方式创建所需类或接口的对象,不用关心对象内部的构造。
可以看到有这个一行代码在SQLServeDAL里面:
Public class Product:IProduct
{
……
}
表明Product也是IProduct类型工厂的作用是决定实现类,至于用不用反射,那就不一定了!这里动易用的反射是为了方便向不同的数据库平台上迁移
大话设计模式楼主,您一定要看看这本书,这绝对是您的梦想,这是一本呕心沥血的典范,楼主,您一定要看看这本书
楼主,您一定要看看这本书楼主,您一定要看看这本书楼主,您一定要看看这本书楼主,您一定要看看这本书
楼主,您一定要看看这本书
楼主,您一定要看看这本书