工厂模式 Factory

工厂模式

记得一个好友面试的时候,面试官问他,你怎么获得一个类的对象的好友说,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java定时器写法_java定时器的写法是什么样?

定时器的用法是java核心基础之一&#xff0c;很多特殊功能都需要用到定时器&#xff0c;下面一起来看看定时器是如何编写的吧。示例&#xff1a;一个具备周期性定时(毫秒级);单时刻定时(秒级);多时刻定时(秒级)。后两个时间的设置必须符合“yyyy-MM-ddHH:mm:ss”、“yyyy-MM-dd…

CentOS中vsftp安装、配置、卸载

CentOS中vsftp安装、配置、卸载转载http://www.zjgsq.com/1509.html转载于:https://blog.51cto.com/bbtao/1606816

struts2文件上传

/*** 单文件的上传* author Administrator**/public class FileUploadAction extends ActionSupport {private static final com.opensymphony.xwork2.util.logging.Logger logger LoggerFactory.getLogger(FileUploadAction.class);//上传文件private File upload;//保存路径…

python的所有库_Python 常用库

前言之前重写了视频字符画处理的代码&#xff0c;然后这两天又在研究命令行和网络。读了一点开源工具的代码&#xff0c;越来越觉得有必要针对性地学习一下一些重要的基础库。这里呢就列个小清单&#xff0c;把我认为有必要学习的库写一下。带 [ x ] 的表示已完成时间time&…

401 Palindrome

这道题最初我是没理解清楚题意,我以为那些reverse栏空白的字母是省略了.后来在这个论坛找到了更多的测试数据,发现了自己理解错了,重新读题 ,修改了下代码- -.弄了很久才AC 我的思路和别人有点不同的是,我是通过计算来得到在常量表中的位置 好吧 这道题本来该总结很多的,今天…

东北大姐剪纸被误认为油画,遭人质疑二十多年,只因太过逼真,看完后:真香!不愧是天下第一剪!...

全世界只有3.14 % 的人关注了爆炸吧知识“这是剪纸&#xff1f;太惟妙惟肖了&#xff0c;我还以为是水彩画呢&#xff01;”这是一位网友的留言。茂盛的树木、潺潺的流水……这些栩栩如生的场景&#xff0c;真难想象竟是出自,一双巧手和一把剪刀。这些作品&#xff0c;全部来自…

2021 年 9 月 TIOBE 指数 C# 同比增长突破 1.2%

TIOBE 编程社区指数是编程语言流行程度的指标。该指数每月更新一次。评级基于全球熟练工程师、课程和第三方供应商的数量。谷歌、必应、雅虎、维基百科、亚马逊、YouTube 和百度等流行搜索引擎用于计算评分。C# 近期发展状态不错&#xff0c;依旧在榜单中排第五&#xff0c;但排…

java基础面向对象_java基础面向对象

一、面向对象之封装1. 面向对象的三个特征是&#xff1a;封装、继承和多态。2. Java开发过程&#xff1a;要实现某个功能&#xff0c;首先要找能够实现这个功能的对象&#xff0c;如果没有找到&#xff0c;就自己造一个对象&#xff0c;将要实现的功能定义到对象中&#xff0c;…

linux 学习笔记 显示压缩文件 gong.zip 的文件内容

#zip -v gong zip zip info: xxx >删除压缩文件中俄smart.txt 文件 #zip -d gong.zip smart.txt deleting:smart.txt >向压缩文件中gong.zip中添加rpm_info.txt文件 #zip -m gong.zip ./rpm_info.txt adding:rpm_info.txt deflated 79% Unzip命令解压缩文件 >将gong.z…

2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)

鉴于个人精力有限&#xff0c;其他答案将由51CTO相关工作人员不断更新&#xff0c;详见http://training.51cto.com/art/201005/200323.htm以题会友&#xff0c;欢迎跟贴拍砖、讨论。

python qt信号在qml 的使用_QML与Python通信

对于Python3和QML通信&#xff0c;实际上就是 PyQt5QMLPython3混合编程&#xff0c;这是必须的&#xff0c;因为QML做图形界面比较容易&#xff0c;但是做功能实现就用Python比较好&#xff0c;虽然QML也能嵌入 JavaScript代码进行实现&#xff0c;但是这样话还不如用Python来实…

那些35岁的程序员都去哪了

阅读本文大概需要11分钟。大家好&#xff0c;我是findyi&#xff0c;前段时间写过一篇关于大龄程序员的文章&#xff1a;那些40岁的程序员都去哪了&#xff0c;引发了大家的思考和讨论&#xff0c;不少读者私聊问&#xff1a;除了这些出路&#xff0c;还有没有其他可能&#xf…

Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)...

在Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表&#xff08;显示数据一&#xff09;中&#xff0c;解释了如何把Crystal Report整合到Sharepoint2010并把报表数据显示出来&#xff0c;但这样并不完整&#xff0c;因为我们在开发时是以系统帐户进…

那些拧不开瓶盖的女生全都是装的?理工男这样想......

全世界只有3.14 % 的人关注了爆炸吧知识昨天&#xff0c;超模君我正在思考人生&#xff0c;八岁的表妹突然提着一瓶矿泉水站在了我的面前。她可怜兮兮的说&#xff1a;“我想喝水&#xff0c;但是拧不开”。我&#xff1a;“........."超模君我明明亲眼见过她一口气拧开过…

java 代码同步_Java同步代码块 转

Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容&#xff1a;Java同步关键字(synchronzied)实例方法同步静态方法同步实例方法中同步块静态方法中同步块Java同步示例Java同步关键字(synchronized)Java中的同步块用s…

Office 2010 64位版本

最新的Office 2010有了x86和x64两种不同的版本&#xff0c;众所周知的使用x64版本具有可以支持更大的内存等特点&#xff0c;但是也会出现一定的兼容性问题。其中感觉影响比较大的是Access的32位版本和64位版本创建的数据库无法通用&#xff0c;这样以前创建的Access文件就无法…

JUnit 测试

Junit 使用 1、忽略测试方法。在使用Test的方法上使用Ignore&#xff0c;将不会对此方法进行测试 2、测试套件 解决的问题&#xff1a; 1、对测试类进行统一测试&#xff0c;而不必在单独测试类上一个一个进行测试。 使用JUnit的RunWith以及SuiteClassses注解&#xff0c;Suite…

【另类见解】秒杀并非高不可攀

“一提到秒杀很简单这个话题&#xff0c;我知道要被别人鄙视了&#xff1a;你不懂高并发... 这年头开头不画个思维导图都觉得掉价image谈到秒杀&#xff0c;网络上不少于几千片文章&#xff0c;但是大多大同小异。如果你的微信当中关注了几个编程技术类的公众号&#xff0c;我敢…

我又相信爱情了!

1 圣诞限定款的肥宅快乐水更好喝了吗&#xff1f;不&#xff01;更贵了2 周边鬼才&#xff01;这手机壳我爱了3 你以为是个王者&#xff0c;其实是个大脸......4 高温超导材料达到临界温度后能使物体悬浮在不同位置5 火山爆发你见过吗&#xff1f;6 我又相信爱情了&#xff01;…

opencv计算两数组的乘积_#剑指Offer#12. 构建乘积数组

题目描述&#xff1a;给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1]。其中B中的元素B[i]A[0] * A[1]... * A[i-1] * A[i1]... * A[n-1]。不能使用除法。解题思路&#xff1a;首先&#xff0c;仔细理解题意&#xff0c;B[i]是A数组所有元素的乘积&#xff0c;但是没…