Các Design Patterns trong lập trình hướng đối tượng

(Bài viết này được viết dựa trên kinh nghiệm thực tế + tham khảo “Gang of Four”)
Trong lập trình hướng đối tượng nói chung, các design pattern được phân chia làm 3 loại:
– Creational patterns
– Structural patterns
– Behaviour patterns

1. Creational patterns: Gồm Simple Factory, Factory Method, Abstract Factory, Builder, Prototype, SingleTon/MultiTon
a. Simple Factory: Một factory chung sẽ làm nhiệm vụ phân phối các đối tượng theo yêu cầu
– Interface IVerhicle
– Car, Truck: IVerhicle
– IVerhicle VerhicleFactory.Get(CarType)
b. Factory Method: Việc phân phối các đối tượng được thực hiện thông qua các factory chuyên biệt
– Interface Iverhicle, IVerhicleFactory{Get();}
– Car, Truck: Iverhicle
– CarFactory, TruckFactory: IVerhicleFactory
– Car = CarFactory.Get(), Iverhicle TruckFactory.Get()
c. Abstract Factory: Tương tự như Factory Method trong việc phân phối các đối tượng. Tuy nhiên, trong quá trình phân phối có sự che dấu cách thức cung cấp đối tượng.
– Interface Iverhicle, IVerhicleFactory{Get();}
– Car, Truck: Iverhicle
– CarFactory, TruckFactory: IVerhicleFactory
Factory factory = new CarFactory()
Car = factory.Get()
Factory factory = new TruckFactory()
Truck = factory.Get()
Xét về bản chất thì tại thời điểm tạo đối tượng factory, bản thân đối tượng chính là một thể hiện của một factory cụ thể (ví dụ CarFactory, TruckFactory). Vì vậy có thể coi pattern này là một implementation của Factory Method, điểm khác chính là ở cách thức lấy đối tượng ra mà thôi.

d. Builder: Tương tự như Abstract Factory về cách thức implement, điểm khác biệt cơ bản giữa hai pattern này là ở cách thức xây dựng lên đối tượng trước khi phân phối: Abstract Factory thường áp dụng cho những đối tượng có tính available/imediately cao, trong khi Builder áp dụng cho những đối tượng mà việc xây dựng chúng trải qua nhiều công đoạn, cần phải “build”.
e. Prototype: Việc khởi tạo các đối tượng dựa trên clone từ một đối tượng mẫu (prototype)
f. SingleTon/Multiton: Singleton: Một thể hiện của đối tượng được tạo ra một lần duy nhất và được truy cập đồng nhất từ mọi điểm. Multiton: Mở rộng của Singleton, cho phép truy cập thể hiện qua key, với mỗi key chỉ có một đối tượng duy nhất.

(còn tiếp)


Error “The requested opreation requires elevation” while installing a program

You got the error “The requested operation requires elevation” while trying to install a program on your computer.


The advanced User Access Control (UAC) introduced in the more recent operating systems like Windows Vista, Windows 7, Windows 2008 & Windows 2008 r2 will not allow the members of the Administrator group to install a software in the silent mode; it is restricted to the default administrator. You will get this error message when you have specified a user who is a member of the Administrator group in the Run As option while defining an Install Software configuration.

Since this is the default behavior of the operating system, it cannot be overcome without disabling the UAC. However, as a workaround to this problem you can try to run the installer under Administrator privilege. Remember to check any harmful thread from the installer before performing this operation.

If it does not help, check out more solution here.

Resolve error while install/uninstall SQL server Express 2005: Failed to load sqlspars.dll

1. By REGEDIT tool: open HKLM\Software\Microsoft\Microsoft SQL Server\90\Bootstrap

2. View the parameter WYukonBootstrapDir (it seems to be Local Settings\Temp in your profile)

3. Copy there sqlspars.dll from c:\program files\microsoft sql server\90\setup bootstrap to the path that is the value of parameter above

4. Run the SETUP again

Access to shared folders on network which credential authentication required

The advantage of this method is that you can login to any shared resource regardless same domain or not. You will not also need to impersonate to any account. All you need is just to put this code in (C# language) into the top of your class, then enjoy it 🙂

        privatestaticexternint WNetAddConnection2A(refNetResource pstNetRes, string psPassword, string psUsername, int piFlags);
        privatestaticexternint WNetCancelConnection2A(string psName, int piFlags, int pfForce);
        publicint iScope;
        publicint iType;
        publicint iDisplayType;
        publicint iUsage;
        publicstring sLocalName;
        publicstring sRemoteName;
        publicstring sComment;
        publicstring sProvider;
        privateconstint RESOURCETYPE_DISK = 0x1;
    privatevoid LoginToShare(string serverName, string shareName, string user, string password) {
        string destinationDirectory = string.Format(@"\\{0}\{1}", serverName, shareName);
        NetResource nr = newNetResource();
        nr.iScope = 2;
        nr.iType = RESOURCETYPE_DISK;
        nr.iDisplayType = 3;
        nr.iUsage = 1;
        nr.sRemoteName = destinationDirectory;
        nr.sLocalName = null;

        int flags = 0;
        int rc = WNetAddConnection2A(ref nr, password, user, flags);
        if (rc != 0) thrownewWin32Exception(rc);

    privatevoid LogoutFromShare(string serverName, string shareName)
        string destinationDirectory = string.Format(@"\\{0}\{1}", serverName, shareName);
        int flags = 0;
        int rc = WNetCancelConnection2A(destinationDirectory, flags, Convert.ToInt32(false));

There’re two function you can use, first use:


to log in to the shared resource. If the verification is successul, then you can access to resource by path as without verification or you will get an error message like wrong username/password.

Once your work done, call


to disconnect from resource.