Design Pattern: Singleton in C#
เรามรู้จัก design pattern กันดีกว่า เขาว่า ถ้าได้ทำความเข้าใจ ท่านจะเปลี่ยนวิถีการ ออกแบบ โปรแกรมของท่านตลอด ไป นอกจากนั้น ท่านผู้รู้ยังกล่าวว่า หากต้องการ ออกแบบโปรแกรมของท่านให้มี สถาปัตยกรรม ที่ ดีมีความยืดหยุ่นต่อการนำปใช้ และการบำรุงรักษาแล้วละก็ ต้องเรียนรู้เรื่อง Design pattern ซะ ….
นี่ก็เป็นสาเหตุหนึ่งให้ เราต้องหันมาพัฒนาตนเองต่อไป ผมก็เลยจะนำเอาเรื่องราวต่าง ๆ ที่นอกจากการ ที่เราจะเน้นหนักไปทางการเขียนแล้ว เราก็จะมองในเรื่อง ของ สถาปัตยกรรมของ ระบบด้วย ครับ นั่นเป็นสิ่งหนึ่งที่จทำให้เราส้รางโปรแกรมที่มี คุณภาพได้ สำหรับ บทความนี้ผมก็จะพูดเรื่อง design pattern ซึ่งก็คงจะพูดเป็น เรื่อง ๆ เนื่องจาก design patterns นั้นมีอยู่มากมาย และหลากหลายการใช้งาน ครับ สำหรับในบทนี้เราก็จะพูดถึง desgin pattern ที่ชื่อว่า “singleton”
สำหรับ คำจำกัดความของ Singleton pattern นั้น ท่านผู้รู้ก็กล่าวว่า ในบางครั้งเราต้องการให้ class มีเพียง หนึ่ง instance และให้มี มีช่องทางเข้าถึง เป็น global point access ครับ
sigleton pattern นี้เรามักจะใช้กับส่วนของระบบที่ต้องการให้ มี instance เดียวในระหว่างการทำงาน เช่น file system หรือ window manager ครับ … 🙂
รองมาดูส่วนที่เป็น code ของ class นี้ดูนะครับ
namespace DesignPatterns
{
/// <summary>
/// Singleton class implements that simplest version of the Singleton
/// design pattern.
/// </summary>
public sealed class Singleton
{
private static readonly Singleton _instance = null;
// make the default constructor private, so that no can directly create it.
private Singleton()
{
}
// public property that can only get the single instance of this class.
public static Singleton Instance
{
get
{
if (_instance == null)
_instance = new Singleton();
return _instance
}
}
}
}
จาก code จะเห็นว่า constructor เราจะกำหนดให้เป็น private เพื่อให้ ไม่ให้ส่วนอื่นในโปรแกรมสามารถที่จะสร้าง instance ของ class นี้ได้ ซึ่งเป็นการ บังคับให้เป็นไปตามข้อกำหนด ของ pattern นี้
เราจะเห็นว่าเราได้ประกาศ ตัวแปร static ชื่อว่า _instance เป็น member variable ซึ่งมี datatype เป็นชนิดเดียวกับ class และ access ผ่านทาง property ชื่อ Instance (ตัวแปร static นั้นจะถูกสร้างไว้ครั้งเดียว ครั้งแรกที่ถูกเรียกใช้) และจะเห็นว่าตัวแปรนี้ไม่สามารถ แก้ไขได้เนื่องจากว่าถูกกำหนดให้เป็น readonly นะครับ
สุดท้ายดังที่กล่าวไป ครับ public Instance property นั้นถูก define ไว้เพื่อสำหรับส่งค่า ของตัวแปร _instance ให้กับผู้เรียกใช้ เท่านั้น ซึ่งถูกำหนดให้เป็น static property นี้มีไว้เพื่อให้เป็นที่ หลักในการ เข้าถึง instance ของ class ซึ่งเพื่อให้เป็นไปตามข้อกำหนด ของ pattern นี้
สุดท้ายจริง เรารองมาดูที่ code ของการเรียกใช้ class นี้กันนะครับ
static void Main(stirng [] args)
{
Singleton obj1 = Singleton.Instance;
Singleton obj2 = Singleton.Instance;
obj1.ToString();
obj2.ToString();
}
คงพอที่จะได้ idea บ้างนะครับ มีอะไรไม่เข้าใจ ก็ เมล์มาคุยได้นะครับ หรือ จะศึกษา singleton เพิ่มได้อีกตาม link เลยครับ
ธีระพงษ์ สนธยามาลย์ Senior Programmer Soft Speed Solution s_teerapong2000@yahoo.com
Creating and Using a Static Library (C++) การสร้างและการใช้งาน static library ….
การสร้างและการใช้งาน static library ….
คงไม่ต้อง ให้คำอธิบาย นะครับ ว่า static library คืออะไร เพราะ ถ้าเราหาเรื่องนี้อ่าน ก็หมายถึงว่าเราอยากรู้ว่ามันเป็นอย่างไร ใช้งานอย่างไร ครับ การใช้ static library นั้นเป็นหนทางที่ดีในการ reuse code หรือ การเขียนโปรแกรมแบบที่สามารถนำส่วนของ code ที่ใช้บ่อย ๆ มารวมกันไว้ที่ใดที่หนึ่ง ให้สามารถถูกเรียกใช้ได้ ทั่วไป โดยไม่ต้อง ไปเขียน code ลักษณะเดียวกัน ทุกครั้งที่ต้องการใช้งาน ไหนบอกว่าจะไม่อธิบายไง นั่นก็คือ เขียนครั้งเดียว ใช้ได้ พร่ำเพรื่อ ฮะ ฮะ
ในบทความนี้ก็จะกล่าวถึง
- การสร้าง static library
- การเพิ่ม class ลงใน static library
- การ สร้าง app ที่เรียกใช้ หรือ อ้างอิง function หรือ class ใน static library
ก่อนอื่นต้อง บอกก่อนว่า ผมอ้างอิง visual c++ ของ Microsoft นะครับ อาจจะเริ่มตั้งแต่ visual studio .NET ขึ้นไปนะครับ
การสร้าง static library
ในการสร้าง static library นั้นเรา ทำตาม ขั้นตอน เหล่านี้นะครับ
- สร้าง Project ใหม่ [เลือก New -> Project ]
- กำหนด ให้ Project type เป็น Win32 [visual c++ -> Win32 เลือก console application ]
- กำหนดชื่อ project ให้เป็น MatchFuncLib หรือ ชื่ออื่นก็ได้ตามที่ต้องการ และกำหนด solution Name ให้เป็น StaticLibrary หลังจากนั้น ก็ click OK
- click Next เมื่อ เจอหน้า Win32 Application Wizard
- กำหนด Application type ให้เป็น static library
- และเอา Precompiled header ออก

- สุดท้าย Click finish เพื่อจบขึ้นตอนการสร้าง Project
การเพิ่ม class ลงใน static library
- สร้าง Header file ให้กับ class ใหม่
- ที่ Project menu , เลือก Add New Item หลังจาก Add New Item dialog box แสดงขึ้นมาให้ เลือก code และ Header File(.h) กำหนดชื่อ ให้เป็น MathFuncsLib.h แล้ว กดปุ่ม Add จะได้ file เปล่าๆ ขึ้นมาหนึ่ง file
- เพิ่ม code นี้ลงไป code นี้ผมเอามาจาก http://msdn.microsoft.com/en-us/library/ms235627.aspx นะครับ หากต้องการ ข้อมูลเพิ่มเติม ให้เป็นตาม link ได้เลย
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a – b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static double Divide(double a, double b);
};
}
- สร้าง source file โดย Project -> Add New Item เลือก C++ file(.cpp) กำหนดชื่อ ให้เป็น MathFuncLib.cpp และ click Add จะได้ file เปล่ามาอีกหนึ่ง file
- พื่อ implement function ต่าง ที่อยู่ใน header file ขั้นแรกเรา จะทำการ include header file ชื่อ MathFuncLib.h และจึง implement ตัง functions ทั้งหมด ตาม code นี้
// MathFuncsLib.cpp
// compile with: /c /EHsc
// post-build command: lib MathFuncsLib.obj
#include "MathFuncsLib.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a – b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
เอาละครับ มาถึงตรงนี้เรา ก็ ได้ทำการ สร้าง Static library Project ขึ้นมาแล้ว ซึ่ง ถ้าเราสังเกตจะเห็น ว่ามันมี สอง file ชื่อ MathFuncsLib.h และ MathFuncsLib.cpp เราประกาศ class ไว้ใน MatchFuncsLib.h และ implement ใน MatchFuncsLib.cpp นะครับ หลังจากนี้ เราจะทำการ build project ให้เป็น library
ก่อนทำการ Build ให้ทำการ กำหนด project properties ให้ กำหนด configuration properties เป็น general และ Configuration Type ให้เป็น static library(.lib) กดปุ่ม OK เพื่อบันทึกการเปลี่ยนแปลง
Compile static library โดยการ Build Solution จาก Build menu เป็นการจบขั้นตอนการสร้าง static library เพื่อให้โปรแกรม อื่นเรียกใช้งาน
ต่อไปเป็นตัวอย่าง การเรียก ใช้ function จาก static library จาก console application
– สร้าง console application ( win32 console application ) โดยอาจ ตั้งชื่อให้เป็น MyExecRefsLib.cpp
– เพื่อที่จะใช้ math routines ที่สร้างไว้ใน static library เราจะต้องทำการ อ้างอิงไปหา หรือ Reference
- ให้เลือก Reference จาก Project menu ใน properties page dialog box ให้ขยาย common properties node และเลือก reference แล้วเลือก Add New Reference
- ขณะนี้ Add reference dialog box จะแสดง ใน dialog box นี้แสดง รายการ libraries ทั้งหมด ที่เราสามารถอ้างอิง ในส่วนของ Project tab นั้นแสดง Projects ทั้งหมด ที่อยู่ใน solution และ libraries ต่าง ๆ ที่มีอยู่ ใน Project tab นี้เรา เลือก MathFuncsLib แล้ว OK
- เพื่อให้เราสามารถ อ้างอิงไปยัง header files ของ static library ได้ เราต้อง แก้ไข include directories path โดย ทำดังนี้ ใน Property Pages dialog box, ขยาย Configuration node ขยาย C/C++ node เลือก General
- เพิ่ม Additional Include Directories พิมพ์ หรือ เลือก path ที่ MathFncsLib.h ตั้งอยู่
#include "stdafx.h"
#include <iostream>
#include "MathFuncsLib.h"
using namespace std;
//#include "iostream.h"
int _tmain(int argc, _TCHAR* argv[])
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a – b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
return 0;
}
ทั้งหมด คงพอจะเห็น การทำงานนะครับ หวังว่าจะได้ อะไร ไปบ้าง นะครับ มีอะไร ไม่เข้าใจ mail มาคุยกันนะครับ s_teerapong2000@yahoo.com
Cross-page PostBack , PostBackUrl
บทความนี้เป็นบทความต่อเนื่องจาก บทความเรื่อง PostBack ผมได้ทิ้งท้ายไว้ว่า PostBack นั้นใช้งานเฉพาะใน single page และ หากต้องการที่จะทำ Postback ระหว่าง Page นั้นผมก็จะมาพูดในบทความนี้ โชคดีที่เราอ้างอิง ASP.NET 2.0 เพราะว่าเป็น approach ที่เพิ่งจะมีใน version นี่ครับ ส่วนท่านที่ใช้ version ก่อนหน้านี้ รู้สึกว่าจะไม่มีนะครับ ไม่มีไม่ไดหมายความว่าทำไม่ได้นะครับ เขาใช้ Server.Transfer ซึ่งเราก็จะพูดกันใน บทความนี้ด้วยเช่นเดียวกัน
เรามาพูดถึง เรื่อง Cross-Page postbacks กันต่อครับว่า สิ่งที่เป็นส่วนประกอบพื้นฐานที่ทำให้เกิดการทำงานลักษณะนี้ก็คือ property ที่เรียกว่า PostBackUrl ซึ่ง กำหนดโดย interface ที่ชื่อ IButtonControl และใช้งานใน Button controls ต่าง ๆ เช่น ImageButton, LinkButton, และก็ Button
การใช้งาน cross-page posting สามารถทำได้โดย การกำหนด ค่า PostBackUrl ให้อ้างอิงไปยัง webpage ที่เราต้องการ ( web form นะครับ ) เมื่อใดที่ user คลิก ปุ่ม Page จะทำการ posts ไปยัง page ที่กำหนดไว้ที่ PostBackUrl พร้อมกับค่าต่าง ๆ ใน input controls ของ page ปัจจุบัน คงพอจะเห็น ภาพนะครับ เราลองมาดูตัวอย่างกันนะครับ
สมมุติว่า เราสร้าง web form (CrossPage1.aspx)ที่มี text box อยู่สอง text box และ button ซึ่งเราจะกำหนด ให้ post ไปยัง page ที่ชื่อว่า Crosspage2.aspx
.
.