设计模式:单例、工厂、适配器、责任链、观察者等等

单列
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 模式。

猜你喜欢

转载自blog.csdn.net/tianhouquan/article/details/82467836