日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

工厂模式 Factory

發布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工厂模式 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。