创建型模式:Factory Method 工厂方法模式

                                             创建型模式:Factory Method 工厂方法模式

1、从耦合关系谈起
  1)耦合关系直接决定着软件面对变化时的行为。
  2)模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改。
  3)模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变。
 
2、动机(Motivation)
  1)在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
  2)如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?

3、意图(Intent)
  定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
                                                                             ——《设计模式》GoF
                         
4、实例:创建汽车
//汽车类型
public abstract class AbstractCar
{
  public abstract void StartUp();//启动
  public abstract void Run();    //跑
  //转向
  public abstract void Turn(Direction direction);  
  public abstract void Stop();   //停
}

public class HongqiCar : AbstractCar
{
  public override void StartUp()//启动
  {
  }
  public override void Run()   //跑
  {
  }
  public override void Turn(Direction direction)
  {
  }
  public override void Stop()  //停
  {
  }
}

//另一文件:汽车框架,测试汽车,肯定不能只测一种车了
public class CarTestFramework
{
  //往往这里应不止一个参数,可能要测试一批汽车
  //可用深拷贝实现:car.Clone();这将用到原型模式
  public void BuildTestContext(CarFactory carFactory)
  {
    AbstractCar abstractCar = carFactory.CreateCar();
    abstractCar.StarUp();
    abstractCar.Run();
    ......
  }
}

//工厂方法
public abstract class CarFactory
{
  public abstract  AbstractCar CreateCar();
}

public class HongqiCarFactory : CarFactory
{
  public override AbstractCar CreateCar()
  {
    return new HongqiCar();
  }
}

//客户程序
class App
{
  public static void Main()
  {
    //利用反射得到是具体哪类汽车对象
    //程序集的名字
    string assemblyName = ConfigurationSettings["FactoryAssebmly"];
    //工厂方法的名字
    string factoryName = ConfigurationSettings["FactoryClass"];
   
    Assembly assembly = Assembly.Load(assemblyName);
    Type t = assembly.GetType("factoryName");
    CarFactory carFactory = Activator.CreateInstance(t);
   
    CarTestFramework carTestFramework = new CarTestFramework();
    carTestFramework.BuildTestContext(carFactory);
  }
}

5、Factory Method模式的几个要点
  1)Factory Method模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。
  2)Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  3)Factory Method模式解决“单个对象”的需求变化,Abstract Factory模式解决“对象部分”的需求变化。

你可能感兴趣的:(创建型模式:Factory Method 工厂方法模式)