工厂模式 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
總結
以上是生活随笔為你收集整理的工厂模式 Factory的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: js数字相加
- 下一篇: 401 Palindrome
