[英]Why is a Spring singleton-scoped bean better than a classic Singleton pattern?
[英]Singleton Pattern in VBScript (Classic) ASP
我剛剛創建了FirePHP服務器端庫的Classic ASP版本,可與常規的舊FirePHP控制台一起使用。
參見Github項目
但是,在我的實現中,我必須創建一個全局變量來存儲類實例。
我什至不知道如何創建靜態方法,從而使用這種語言的單例模式。
您可以通過將實例添加到應用程序對象中來創建單例。 只要該Web應用程序正在運行,它就會在所有會話之間共享。
以下代碼應進行演示:
<%
class MySingleton
public function getInstance()
if not isObject(application("MySingleton")) then
set application("MySingleton") = new MySingleton
end if
set getInstance = application("MySingleton")
end sub
end class
'usage
set instance = (new MySingleton).getInstance()
%>
重要提示:上面的示例只是一個模擬操作方法。
實際上,Singleton被某些人視為反模式。
您可以將類重命名為cFireASP ,使log方法成為默認功能,並在您的包含文件中創建一個全局FALog實例。 這為您提供了相同的API,並具有可以將引用傳遞到FALog實例arround的優點。
為了進一步分離您的應用程序,您可以將該實例的實例放置到服務定位器中。 這樣,您的其他類就不必直接引用各種全局實例,從而為您提供了另一個接口來將接口與實現分開。
提示:您在類中引用了響應對象,這會使單元測試變得困難。 使用依賴注入或所述服務定位器將類與其全局環境分開。
class cSomePageController
public env
private response, session, application, server, db_conn
private sub class_initialize
set response = env.response
set session = env.session
set application = env.application
set server = env.server
set db_conn = env.db_conn
end sub
public sub handle_request(request)
...
end sub
end class
...
set controller = new cSomePageController
set env = new ASPenv
set controller.env = env
call controller.handle_request(env.request)
' Alternatieve configuration for testing using a mock objects
set mock_env = new MockEnv
set controller.env = mock_env
call controller.handle_request(mock_env.request)
....
由於我認為VBScript語言構造不會自然地與類一起使用,因此我希望使用以下兩種方法之一:
為應用程序范圍的OnStart事件創建一個處理程序,然后加載該類的單個實例並將其分配給Application變量。 由於此事件是應用程序啟動時運行的第一個代碼,因此可以假定實例將始終被加載。
該方法的優點是不必在將使用sigleton對象的頁面上包含任何文件(因為Application.Context可用於所有ASP文件):
在Global.asa
創建單例實例
Sub Application_OnStart
Set Application.Contents("MySingleton") = new MySingleton
End Sub
在“ anyfile.asp
”中使用單例實例:
Dim obj : Set instance = Application.Contents("MySingleton")
obj.doAnyMethod()
創建一個函數以返回單例變量。 如果對象已分配給Apllication.Context變量,則只需將其返回即可,如果尚未分配,則在返回之前先加載並賦值。
這種方法的優點在於,只有在首次使用實例時才創建該實例。 由於我總是通過#include指令加載on庫,所以這對我來說不是問題,將是我的首選方式。
創建函數以返回myLib.inc
單例實例
Function GetSingleton
If IsEmpty(Application.Contents("MySingleton")) Then
Set Application.Contents("MySingleton") = new MySingleton
End If
Set GetSingleton = Application.Contents("MySingleton")
End Function
在“ anyfile.asp
”中使用單例實例: <!--#include virtual="/myLib.inc" -->
Dim obj : Set instance = GetSingleton()
obj.doAnyMethod()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.