单列
Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。
从另一个角度来说,Singleton模式其实也是一种职责型模式。因为我们创建了一个对象,这个对象扮演了独一无二的角色,在这个单独的对象实例中,它集中了它所属类的所有权力,同时它也肩负了行使这种权力的职责!
public class Singleton {
private static Singleton singleton = null;
private Singleton (){
}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
抽象工厂模式(Abstract Factory)
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。
/// <summary>
/// Factory类
/// </summary>
public class Factory
{
public Tax CreateTax()
{
return new ChineseTax();
}
public Bonus CreateBonus()
{
return new ChineseBonus();
}
}
观察者模式(Observer Pattern)
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
public abstract class Stock
{
private List<IObserver> observers = new List<IObserver>();
private String _symbol;
private double _price;
public Stock(String symbol, double price)
{
this._symbol = symbol;
this._price = price;
}
public void Update()
{
foreach (IObserver ob in observers)
{
ob.SendData(this);
}
}
public void AddObserver(IObserver observer)
{
observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
observers.Remove(observer);
}
public String Symbol
{
get { return _symbol; }
}
public double Price
{
get { return _price; }
}
}
public class Microsoft : Stock
{
public Microsoft(String symbol, double price)
: base(symbol, price)
{ }
}
public interface IObserver
{
void SendData(Stock stock);
}
public class Investor : IObserver
{
private string _name;
public Investor(string name)
{
this._name = name;
}
public void SendData(Stock stock)
{
Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, stock.Symbol,stock.Price);
}
}
客户端程序代码如下:
class Program
{
static void Main(string[] args)
{
Stock ms = new Microsoft("Microsoft",120.00);
ms.AddObserver(new Investor("Jom"));
ms.AddObserver(new Investor("TerryLee"));
ms.Update();
Console.ReadLine();
}
}
适配器模式(Adapter Pattern)
在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。