顯示具有 DesignPatterns 標籤的文章。 顯示所有文章
顯示具有 DesignPatterns 標籤的文章。 顯示所有文章

2011年6月8日 星期三

[C#] Generic Singleton Pattern

C# singleton pattern with generic.
Why need using generic singleton?
If we use an interface named ISingleton, and provide an Instance property, we must implement in all derived class.
Or we need to provide Instance property in all singleton class.
That is a trouble, so we use generic to solute it
Because singleton need provide private or protected constructor, so we can't use new T() in generic singleton pattern.
So we need to use reflection to call constructor.
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace DesignPattern
{
public class TSingleton<T> where T : class
{
static object SyncRoot = new object();
static T instance;
public static readonly Type[] EmptyTypes = new Type[0];
public static T Instance
{
get
{
if (instance == null)
{
lock (SyncRoot)
{
if (instance == null)
{
ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, EmptyTypes, null);
if (ci == null) { throw new InvalidOperationException("class must contain a private constructor"); }
instance = (T)ci.Invoke(null);
//instance = Activator.CreateInstance(typeof(T)) as T;
}
}
}
return instance;
}
}
}
}

2010年11月10日 星期三

[Design Pattern] MVC pattern



Model–View–Controller (MVC) is a software architecture,[1] currently considered an architectural pattern used in software engineering. The pattern isolates "domain logic" (the application logic for the user) from the user interface (input and presentation), permitting independent development, testing and maintenance of each (separation of concerns).

The model manages the behavior and data of the application domain, responds to requests for information about its state (usually from the view), and responds to instructions to change state (usually from the controller). In event-driven systems, the model notifies observers (usually views) when the information changes so that they can react.

The view renders the model into a form suitable for interaction, typically a user interface element. Multiple views can exist for a single model for different purposes. A viewport typically has a one to one correspondence with a display surface and knows how to render to it.

The controller receives input and initiates a response by making calls on model objects. A controller accepts input from the user and instructs the model and viewport to perform actions based on that input.

An MVC application may be a collection of model/view/controller triads, each responsible for a different UI element. The Swing GUI system, for example, models almost all interface components as individual MVC systems.

MVC is often seen in web applications where the view is the HTML or XHTML generated by the app. The controller receives GET or POST input and decides what to do with it, handing over to domain objects (i.e. the model) which contain the business rules and know how to carry out specific tasks such as processing a new subscription, and which hand control to (X)HTML-generating components such as templating engines, XML pipelines, AJAX callbacks, etc.

The model is not a database: the 'model' in MVC is both the data and the business/domain logic needed to manipulate the data in the application. Many applications use a persistent storage mechanism such as a database to store data. MVC does not specifically mention the data access layer because it is understood to be underneath or encapsulated by the model. Models are not data access objects; however, in very simple apps that have little domain logic there is no real distinction to be made. Active Record is an accepted design pattern which merges domain logic and data access code - a model which knows how to persist itself.

[Design Pattern] Facade Pattern


The facade pattern is a software engineering design pattern commonly used with Object-oriented programming. (The name is by analogy to an architectural facade.)

A facade is an object that provides a simplified interface to a larger body of code, such as a class library. A facade can:

make a software library easier to use, understand and test, since the facade has convenient methods for common tasks;
make code that uses the library more readable, for the same reason;
reduce dependencies of outside code on the inner workings of a library, since most code uses the facade, thus allowing more flexibility in developing the system;
wrap a poorly-designed collection of APIs with a single well-designed API (as per task needs).


2010年6月27日 星期日

[IPhone] Observer with Game Development

Introduction
When I develop my game project. I use a global timer to update game scene, and game scene will update all game roles in game scene if need.
Background
After study observer, I think game scene is a observable and it can notify game role to update.
So I implement observer pattern in my game.

UML


Observer Code

class Observable;
class Observer : public NSObject
{
private:
// --- Add private member --- //
public:
// --- Add public member --- //
Observer();
virtual ~Observer();

virtual void Update() = 0;
};

typedef set<observer*> SET;

class Observable : public NSObject
{
private:
// --- Add private member --- //
SET m_observers;
public:
// --- Add public member --- //
Observable();
virtual~Observable();

void RegisterObserver(Observer *o);
void RemoveObserver(Observer *o);
void NotifyObservers();
};
void Observable::RegisterObserver(Observer *o)
{
m_observers.insert(o);
}
void Observable::RemoveObserver(Observer *o)
{
m_observers.erase(o);
}

void Observable::NotifyObservers()
{
SET::
reverse_iterator index;
SET::
reverse_iterator end = m_observers.rend();
for(index = m_observers.rbegin(); index != end; index++)
{
((Observer*)(*index))->Update();
}
}