Feeds:
文章
迴響

Archive for 2007 年 07 月

C# 實作 ObjectFactory

MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.07.31

上次實作 C++ 版本的 ObjectFactory 之後,最近又需要實作 C# 版本的 ObjectFactory,於是在網路上找到[1]這篇文章。實作 ObjectFactory 的關鍵在於定義了 Factory Method 得 Delegate。讓需要納入 ObjectFactory 的每一個類別都需要實作該 Delegate。我們直接以 [1] 中的範例來了解 ObjectFactory 實作的概念。

首先定義 Factory Method 的 Delegate 如下:

/// <SUMMARY>
/// A handler function for the factory to create objects;
/// </SUMMARY>
public delegate AObject ObjectCreator(params object [] list);

接著定義要透過 ObjectFactory 生成的基礎類別,

/// <SUMMARY>
/// Summary description for AObject.
/// </SUMMARY>
public abstract class AObject
{
#region Override

/// <SUMMARY>
/// Force all descendents to implement.
/// </SUMMARY>
public abstract void Print();

#endregion

#region protected

/// <SUMMARY>Some variable to play with.</SUMMARY>
protected Int32 m_nType;

#endregion
}


[1] 使用抽象類別來實作,這不是必須的,你可以依據自己的需要作調整。接著定義你自己的類別族群,以下定義一個示範用的 Class1

/// <SUMMARY>
/// Summary description for Class1.
/// </SUMMARY>
public class Class1 : AObject
{
#region Constants

/// <SUMMARY>
/// 識別碼
/// </SUMMARY>

public const Int32 ClassType = 1;

#endregion

#region C'tor

/// <SUMMARY>
/// Default C'tor.
/// </SUMMARY>
internal Class1()
{
this.m_nType = ClassType;
}

#endregion

#region Overrides

/// <SUMMARY>
/// Implementation of Print.
/// </SUMMARY>
public override void Print()
{
String msg = String.Format("Class: {0, 20} Value: {1, 10}",
ToString(), m_nType*67);
Console.WriteLine(msg);
}

#endregion

#region Static

/// <SUMMARY>
/// A handler function for the factory to create objects;
/// </SUMMARY>
/// The parameter list.
/// <RETURNS>A Class1 object.</RETURNS>
public static AObject ObjectCreator(params object[] list)
{
return new Class1();
}

#endregion
}

最後以上述為基礎所設計的 ObjectFactory 如下:

/// <SUMMARY>
/// Summary description for ObjectFactory.
/// </SUMMARY>
public class ObjectFactory
{
#region Static

/// <SUMMARY>
/// Register handler functions to create new types of objects.
/// </SUMMARY>
/// The type of the object.
/// The handler function.
/// <RETURNS>true if successful.</RETURNS>
public static bool RegisterHandler(Int32 type, ObjectCreator creator)
{
bool res = false;
try
{
if (m_handlers[type] != null)
return false;
// insert the handler to the table according to the type.
m_handlers[type] = creator;
res = true;
}
catch(Exception ex)
{
Console.WriteLine("Can't register handler - "+ex.Message);
}
return res;
}

/// <SUMMARY>
/// Unregister handler functions according to type.
/// </SUMMARY>
/// The type of the object.
/// <RETURNS>true if successful.</RETURNS>
public static bool UnregisterHandler(Int32 type)
{
bool res = true;
try
{
if (m_handlers[type] == null)
return res;
// remove the handler to the table according to the type.
m_handlers[type] = null;
GC.Collect();
}
catch(Exception ex)
{
Console.WriteLine("Can't unregister handler - "+ex.Message);
res = false;
}
return res;
}

/// <SUMMARY>
/// This is the static method that creates all types of objects.
/// </SUMMARY>
/// <REMARKS>Factory method.</REMARKS>
/// The key of objects to create.
/// The parameter list for the object.
/// <RETURNS>An object.</RETURNS>
public static AObject CreateObject(Int32 type, params object [] list)
{
AObject aobject = null;
try
{
// get the handler that creates the objects
ObjectCreator creator = (ObjectCreator)m_handlers[type];
// create the object with the handler.
if (creator != null)
aobject = creator(list);
}
catch(Exception ex)
{
Console.WriteLine("Can't get object from handler - "+ex.Message);
}
return aobject;
}

#endregion

#region Protected

/// <SUMMARY> A table holding the handlers for creating objects. </SUMMARY>
protected static Hashtable m_handlers = new Hashtable();

#endregion
}

ObjectFactory 很典型的會有三個 Method:註冊(RegisterHandler)、移除(UnregisterHandler)和生成(CreateObject)。移除的 Method 不是很必要,註冊是將需要透過 ObjectFactory 生成的 FactoryMethod 紀錄起來,並透過特定的識別碼可以索引,上述是透過 Hashtable 來作對照表,我個人習慣採用 Dictionay<>。生成是透過識別碼取出對應的 FactoryMethod 進行物件生成,這也是定義 ObjectCreator 的目的,如果沒有這個規範的呼叫介面,很難讓 ObjectFactory 生成各種物件。

以下是 ObjectFactory 的使用:

static void Main(string[] args)
{
try
{
// 註冊 Factory Method
ObjectFactory.RegisterHandler(Class1.ClassType,
new ObjectCreator(Class1.ObjectCreator));
ObjectFactory.RegisterHandler(Class2.ClassType,
new ObjectCreator(Class2.ObjectCreator));
ObjectFactory.RegisterHandler(Class3.ClassType,
new ObjectCreator(Class3.ObjectCreator));

// 物件生成
AObject aobject = null;
// creating the objects
for (int i = 0; i<100; i++)
{
aobject = ObjectFactory.CreateObject(i%3+1, null);
aobject.Print();
}

// 移除 Factory Method
if (!ObjectFactory.UnregisterHandler(Class1.ClassType))
Console.WriteLine("Really ?!");

// trying to create an unregistered type
aobject = ObjectFactory.CreateObject(Class1.ClassType, null);
if (aobject != null)
aobject.Print();
else
Console.WriteLine("aobject is null");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}

參考資料
[1] Asa Meltzer, "Delegate Factory"

廣告

Read Full Post »

(C#) IE 右鍵選單移除工具

裝了一堆軟體之後,IE 右鍵選單出現一大堆選項影響操作,每次手動移除又覺得麻煩,所以寫了這個小工具,功能只有一個,移除 IE 右鍵選單。畫面截圖如下:
2007072801

下載:載點#1(24 KB)

程式在 Windows XP Pro SP2 + .NET 2.0 撰寫完成,所以,你的系統必須具有 .NET 2.0 才可使用。

Read Full Post »

一般透過 .NET 存取 Registry 都會使用下面的程式碼

// 開啟 Key
RegistryKey enuKey = Registry.CurrentUser.OpenSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt");
// 刪除子 Key
MenuKey.DeleteSubKeyTree("My Item"); // throw UnauthorizedAccessException

可是上述程式碼在刪除 SubKey 時會丟出 UnauthorizedAccessException,此時要在 OpenSubKey 時,賦予 Write 權限,如下:

RegistryKey enuKey = MenuKey = Registry.CurrentUser.OpenSubKey(@"SoftwareMicrosoftInternet ExplorerMenuExt", RegistryKeyPermissionCheck.ReadWriteSubTree);
MenuKey.DeleteSubKeyTree("My Item"); // Sucess

以上是今天寫程式的一點小心得

Read Full Post »

很久沒有參加研討會,記得上次參加好像是兩年前 Visual Studio 2005 發佈的時候。今天早上抱著愉快的心情往會場飛奔而去。想不到還是和上次一樣找不到會場 @_@,報到程序很簡單,只需要拿網路登記的條碼來兌換投影片。今天的議程安排相當不錯,先從基礎的 WPF 談起,再討論到前端 Sliverlight 技術,最後以 ASP.NET 與 Sliverlight 整合結束。

由於最近在閱讀 Charles Petzold 的 "Application = Code + Markup",所以雖然 WPF 議程佔了上午大半的時間,可是獲得有用的資訊有限。這個議程如果你沒有聽也關係,因為內容大半摘錄至 Adam Nathan 的 "Windows Presentation Foundation" 一書,這個議程對我有幫助的有

1. WPF, Window Form, Win32 間的協同運作方式
2. Visual Studio 與 Expression Blen 2.0 透過 XAML 協同運作,達到介面與邏輯切割的目的
3. 各種讓人驚豔的 Brush

第二個議程 Sliverlight 是 WPF 的子集,如果你對於 WPF 和 Flash/Flex 有接觸,這部份應該也不難聽懂。此議程有許多的 DEMO,其中我對於 Media Player 最感興趣,因為不同於以往的 Windows Media Player,他不只提供許多接口讓開發者可控制,還有提供 Chapter 功能,類似影片目錄功能,你可以題拱影片特定時間點的截圖,使用者可透過畫面決定要不要先跳至此區觀看。除此之外,大部分的 DEMO 我覺得 Flash/Flex 都可以達到。另外,雖然 Sliverlight 號稱跨平台/跨瀏覽器,不過這都只限主流瀏覽器,作業系統方面,雖然 Mono 專案也實作 Monolight,不過是否可以達到完全相容,這個還有待時間考驗。

最後議程是討論 ASP.NET 與 Sliverlight 整合。這個議程的核心就是下面這張圖:2007072602

透過後端的服務,前端 Sliverlight 可以取用資料資料以及與其他使用者進行資料交換。由於 Sliverlight 是 Client 端技術,所以,後端伺服器並限制只能使用 ASP.NET,你可以使用 PHP, JSP, ASP 等。這個未來我也常識透過 PHP + Sliverlight 實作看看。

總結,今天的研討會整體而言看到不少有趣東西,不過真正可用於產品開發上,目前還沒有想到應用。除了看到技術概觀之外,而外的收穫就是知道 XAML 與 Sliverlight 的英文發音 ^O^ 希望以後 Microsoft 多多來高雄辦研討會….

Read Full Post »

建置 Silverlight 1.0 開發環境

Read Full Post »

* 領導一群創新的團隊方法,就是引發他們對心事物的好奇與衝動
* 蠢點子可能變成很棒的點子,只是需要重新表述,或者你的點子可以引發別人的想法,最後變成很棒的點子
* 創新不再是單打獨鬥。而是團隊工作
* 創新就是找到問題並解決他
* 工程師要作兩件事:把不可能變為可能,把可能變為利潤

參考資料
[1] 數位週刊 第 158 期,2007/7/15

Read Full Post »

MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.07.24
你是否執行*.vbs 或 *.js 時會出現如下的錯誤訊息呢?


要解決這個問題,首先檢查 c:windowssystem32wscript.exe 是否存在,如果不存在,請到 Mcirosoft 安裝 WSH。如果存在,請在"開始 | 執行"地方輸入
regsvr32 VBScript
完成 VBScript 元件註冊。再執行
regsvr32 JScript
完成 JScript 元件註冊。透過上述元件註冊應該可以修正問題。

參考資料
[1] Can’t find script engine VBScript

Read Full Post »

Older Posts »