工厂模式

记得一个好友面试的时候,面试官问他,你怎么获得一个类的对象的好友说,new一个啊,的确没错,对象不是new难道还是create...

当然在使用new对象的时候,这段代码也就意味着难以以后的维护和扩展了,怎么让灵活起来呢,这里就说到了工厂模式的好处了

工厂模式的好处

系统的灵活性、可扩展性、可维护性

抽象工厂

这里着重讲下之前在项目中使用到的工厂模式

DataAccess:对象工厂->创建对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Reflection;
using System.Web;
using Jxmstc.Dal;
using Jxmstc.IDal;

namespace Jxmstc.DalFactory
{
    /// <summary>
    /// UserManagement抽象工厂
    /// 作者:
    /// 日期:2009-7-22
    /// </summary>
    public sealed class DataAccess
    {
        private static readonly string assemblyPath = ConfigurationManager.AppSettings["DAL"];

//当前架构
        private static readonly string architecture = ConfigurationManager.AppSettings["Architecture"];

/// <summary>
        /// 构造函数
        /// </summary>
        public DataAccess()
        { }

#region 缓存处理

/// <summary>
        /// 创建对象或从缓存获取
        /// </summary>
        public static object CreateObject(string assemblyPath, string className)
        {
            if (architecture.Trim().ToUpper() == "C/S")
            {
                return Assembly.Load(assemblyPath).CreateInstance(className);
            }

object objType = GetCache(className);//从缓存读取
            if (objType == null)
            {
                try
                {
                    objType = Assembly.Load(assemblyPath).CreateInstance(className);//反射创建
                    SetCache(className, objType);// 写入缓存
                }
                catch
                {
                    throw;
                }
            }
            return objType;
        }
        /// <summary>
        /// 获取当前应用程序指定CacheKey的Cache值
        /// </summary>
        /// 
        /// <param name="cacheKey">缓存标记</param>
        /// <returns>对象</returns>
        public static object GetCache(string cacheKey)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            return objCache[cacheKey];

}

/// <summary>
        /// 设置当前应用程序指定CacheKey的Cache值
        /// </summary>
        /// <param name="cacheKey">缓存标记</param>
        /// <param name="obj">对象</param>
        public static void SetCache(string cacheKey, object obj)
        {
            System.Web.Caching.Cache objCache = HttpRuntime.Cache;
            objCache.Insert(cacheKey, obj);
        }

#endregion

#region 生产对象
        /// <summary>
        /// 创建User数据层接口
        /// </summary>
        /// <returns></returns>
        public static IDal.IUser CreateUser()
        {
            string className = assemblyPath + ".User";
            object objType = CreateObject(assemblyPath, className);
            return (IDal.IUser)objType;
        }

#endregion

}
}

【注】:在最后面我们可以看到CreateUser()返回的是接口类型,使用到了接口的多态,让我们看看这两个类 User和IUser

User

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Jxmstc.Model;
using Jxmstc.IDal;
using Jxmstc.DbUtility;
using System.Data.Common;
using System.Data;

namespace Jxmstc.Dal
{
    public class User : IUser
    {
        protected CustomDbParameterCollection Parameters;
        protected OutputValueCollection outParameters;

#region 构造函数
        /// <summary>
        /// 初始化User的实例。
        /// </summary>
        public User()
        {
            Parameters = new CustomDbParameterCollection();
            outParameters = new OutputValueCollection();

}

/// <summary>
        /// 根据配置文件中给定的连接字串,初始化User的实例。
        /// </summary>
        /// <param name="connectiongStringKey">配置文件中指定的连接字符串</param>
        public User(string connectionStringKey)
        {
            Parameters = new CustomDbParameterCollection(connectionStringKey);
        }
        #endregion

#region 自定义方法
        protected void FillModel(ref Model.UserInfo model, IDataReader dr)
        {
            try
            {
                if (dr.Read())
                {
                    model = new UserInfo();
                    model.UserId = Convert.ToInt32(dr["UserId"]);

model.Account = dr["Account"].ToString();
                    model.Password = dr["Password"].ToString();

model.State = Convert.ToBoolean(dr["State"]);
                    model.Type = Convert.ToInt32(dr["Type"]);

model.Problem1 = dr["Problem1"].ToString();
                    model.Answer1 = dr["Answer1"].ToString();

model.Problem2 = dr["Problem2"].ToString();
                    model.Answer2 = dr["Answer2"].ToString();

}
            }
            catch
            {
                throw;
            }
            finally
            {
                dr.Dispose();
            }
        }
        #endregion

#region IUser 成员

/// <summary>
        /// 通过用户名获取Model 对象
        /// </summary>
        /// <param name="account"></param>
        /// <returns></returns>
        public UserInfo GetModel(string account)
        {
            Model.UserInfo model = null;
            Parameters.Clear();

Parameters.AddInParameter("@Account", DbType.String, account);
            IDataReader dr = DbHelper.ExecuteReader("up_User_GetModelByAccount", Parameters);

FillModel(ref model, dr);
            return model;

}

/// <summary>
        /// 通过用户ID获取 权限ID、模块名、操作名、状态(T/F)
        /// </summary>
        /// <param name="userId">用户ID</param>
        /// <returns></returns>
        public DataSet GetUserPrivilege(int userId)
        {

Parameters.Clear();
            Parameters.AddInParameter("@UserId", DbType.Int32, userId);

return DbHelper.ExecuteDataSet("up_Privilege_ByUserId", Parameters);

}

#endregion
    }
}

IUser:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Jxmstc.Model;
using System.Data;
using System.Data.SqlClient;

namespace Jxmstc.IDal
{
    /// <summary>
    /// 用户表
    /// </summary>
  public interface IUser
    {

/// <summary>
        /// 获取对象实体
        /// </summary>
        /// <param name="account">用户账号</param>
        /// <returns>对象实体</returns>
      Model.UserInfo GetModel(string account);

/// <summary>
      /// 通过用户ID获取改用户在模块上操作的所有权限 既 权限ID、模块名、操作名、状态(T/F)
      /// </summary>
      /// <param name="userId">用户ID</param>
      /// <returns></returns>
      DataSet GetUserPrivilege(int userId);

}
}

前面的User如果用三层来讲的话,属于DAL层和数据库打交道 IUser属于一个映射的桥梁,在BLL层的User中就可以看到作用

Bll.User

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Jxmstc.Model;
using Jxmstc.IDal;
using Jxmstc.DalFactory;
using System.Data;
using System.Data.SqlClient;
namespace Jxmstc.Bll
{

/// <summary>
    /// 业务逻辑类User 的摘要说明。
    /// </summary>
 public   class User
    {
     private readonly IUser dal = DataAccess.CreateUser();
     public User()
     { }

#region 成员方法

/// <summary>
     /// 通过对象得到对象实体
     /// </summary>
     /// <param name="account"></param>
     /// <returns></returns>
     public Model.UserInfo GetModel(string account)
     {
         return dal.GetModel(account);
 
     }

public DataSet GetUserPrivilege(int userId)
     {
         return dal.GetUserPrivilege(userId);
     }
        
        #endregion
    }
}

[注]:这样接口调用的方法就会到DAL层下的User具体方法下,使用到了多态性

Head-First中有讲到工厂模式和简单工厂模式,主要提倡的是使用abstruct, 这也就是abstract和interface的区别

abstract是相关对象中抽象出来的概念,反映的是事物的内部共性,而接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性。

感觉Head-First对工厂模式讲解的不到位,到时候把小胖的大话模式给蹭过来看,嘿嘿。

转载于:https://www.cnblogs.com/sanpi/archive/2011/07/13/2104805.html

工厂模式 Factory相关推荐

  1. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题. ...

  2. 设计模式(四)——工厂模式(Factory Pattern)

    工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  5. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  6. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  7. 一文彻底弄懂工厂模式(Factory)

    文章已收录我的仓库:Java学习笔记与免费书籍分享 模式类型 工厂模式属于创建者模式,与对象的创建有关,其中工厂方法模式用于类,而抽象工厂模式用于对象.创建型类模式将对象的部分创建工作延迟到子类,由子 ...

  8. 设计模式之略见一斑(工厂模式Factory)

    在开发中其实我们已经不知道用到了设计模式中的很多模式 ,只是有些我们还未知它具体是哪种模式来着.如工厂模式,单例,适配,外观模式等一些常见模式. 下面是自己学习的一些相关笔记,以做备忘录. 1.工厂模 ...

  9. Spring模式系列(二) 工厂模式(Factory Pattern) - 理解Spring的第一课

    factory pattern在spring的用法 Beanfactory spring框架最依赖的模式,没有之一 这也许是最多程序员使用过的模式之一,我也在我的项目中用过很多次.工厂模式贯穿于整个S ...

  10. 工厂模式(Factory Patter)

    1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...

最新文章

  1. XAMPP 相关设置(linux下的)
  2. 5G NGC — CAPIF 网络能力开放框架
  3. 从此不再为Web页面中的Tooltip烦恼
  4. 不显示调用super_让不懂编程的人爱上iPhone开发(2017秋iOS11+Swift4+Xcode9版)-第7篇
  5. Oracle经典教程学习笔记
  6. 数模写作必备利器—latex
  7. 十年生死轮回,看国产手机发展四个阶段
  8. “工业4.0”下的可视化工厂建设方案 1
  9. Python获取网络中的存活主机以及哪些主机是Linux
  10. 孙鑫VC学习笔记:第十二讲 (五) 往win.ini的文件中写入数据
  11. 李子奈计量经济学笔记和课后习题答案
  12. BIN转HEX,HEX转BIN,互相转换工具,PIC
  13. C++ ActiveX基础1 使用VS2015创建MFC ActiveX工程项目
  14. 实现ftpserver
  15. tnsping能成功却连不到目标数据库
  16. 如何将Word中数据转换为excel表格
  17. HM-3200: Tetramesh(四面体网格)
  18. 动态链接库和静态链接库
  19. jQuery在IE8上使用,IE8提示“对象不支持此属性或方法”
  20. 【论文理解】理解yolov3的anchor、置信度和类别概率

热门文章

  1. 电脑知识:电脑如何连接电视,在电视上显示?
  2. python给两个列表排序方法_Python连接两个字符串列表并对其元素排序的最佳方法...
  3. list 根据某个数字所在位置_【Python学习笔记】09、使用list和tuple
  4. mysql 5.7.23要钱吗_最新mysql 5.7.23安装配置图文教程
  5. java数据类型及其说明
  6. 都快 2022 年了,这些 Github 使用技巧你都会了吗?
  7. php 批量修改mysql 数据表,字段 字符集编码
  8. 暑期实习面试——艾锝科技,Python实习生
  9. 文件项目SVN+TortoiseSVN+Subclipse使用总结
  10. 华为交换机RRPP配置实验