工厂模式

[ Factory ]

[ 创建型模式 ]

[
计算接口 : 定义了一系列的计算方法
具体计算类 : 继承了计算接口 , 实现了不同的计算方法
对象创建接口 : 定义了一个用于创建对象方法的接口
对象创建类 : 继承了对象创建接口 , 实现了对象创建方法 , 每一个 "具体计算类" 都有一个具体的对象创建工程类 。
]

定义一个用于创建对象的接口 , 让子类决定实例化哪一个类 。工厂方法使一个类的实例化延迟到其子类 。

比简单工厂模式更容易扩展 , 更符合 开放扩展 - 封闭修改原则
简单工厂模式 扩展时需要修改工厂类的判断业务 , 违背了 开放扩展 - 封闭修改 原则


创建计算接口 , 定义计算公用方法名
创建计算子类 , 继承计算接口 , 实现计算方法
创建对象工厂接口 , 定义计算对象生成方法
针对不同的计算子类 , 生成不同的计算子类工厂类 , 继承对象工厂接口 , 实现算法对象生成对象 , 返回计算子类


使用:
声明一个对象工厂接口实例 , 引用要做计算的计算工厂子类
由对象工厂实例创建一个计算对象




源码:

public interface ICalculate
{
  int NumberA { get;set; }
  int NumberB { get;set; }
  int GetResult();
}




public class CalculateAdd : ICalculate
{
  private int _numberA;
  private int _numberB;


  #region ICalculate 成员

  public int NumberA
  {
    get
    {
      return _numberA;
    }
    set
    {
      _numberA = value;
    }
  }

  public int NumberB
  {
    get
    {
      return _numberB;
    }
    set
    {
      _numberB = value;
    }
  }

  public int GetResult()
  {
    return NumberA + NumberB;
  }

  #endregion
}




public class CalculateDiv : ICalculate
{
  private int _numberA;
  private int _numberB;

  #region ICalculate 成员

  public int NumberA
  {
    get
    {
      return _numberA;
    }
    set
    {
      _numberA = value;
    }
  }

  public int NumberB
  {
    get
    {
      return _numberB;
    }
    set
    {
      _numberB = value;
    }
  }

  public int GetResult()
  {
    if (NumberB > 0)
    {
      return NumberA / NumberB;
    }
    else
    {
      return 0;
    }
  }

  #endregion
}




public interface ICalculateFactory
{
ICalculate CreateOperation();
}




public class CalculateAddFactory : ICalculateFactory
{
  #region ICalculateFactory 成员

  public ICalculate CreateOperation()
  {
    return new CalculateAdd();
  }

  #endregion
}




public class CalculateDivFactory : ICalculateFactory
{
  #region ICalculateFactory 成员

  public ICalculate CreateOperation()
  {
    return new CalculateDiv();
  }

  #endregion
}




class Program
{
  static void Main(string[] args)
  {
    ICalculateFactory calculateFactory = new CalculateAddFactory(); 只需要引用不同的计算工厂子类就可以实现不同的算法
    ICalculate calculate = calculateFactory.CreateOperation();
    calculate.NumberA = 10;
    calculate.NumberB = 10;
    int result = calculate.GetResult();
    Console.WriteLine(result);

    Console.ReadKey();
  }
}

posted on 2012-02-21 11:57  多个马甲  阅读(161)  评论(0编辑  收藏  举报