动机:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个, 并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
意图:定义一个用于创建对象的接口,让子类决定实例化 哪个子类。FactoryMethod使得一个类的实例化延迟到子类
UML图:
示例代码:演示说明 ,一个汽车测试软件系统 FactoryMethod的应用
public enum Direction
{
Right,Left
}
public abstract class AbstractCar
{
//启动
public abstract void Startup();
//行驶
public abstract void Run();
//转向
public abstract void Turn(Direction dire);
//鸣笛
public abstract void Deep();
//刹车
public abstract void Stop();
}
/// <summary>
/// 汽车工厂(抽象层)
/// </summary>
public abstract class CarFactory
{
public abstract AbstractCar CreateCar();
}
public class CarTestFramework
{
AbstractCar car;
public void BuildTestContext(CarFactory carfactory)
{
car = carfactory.CreateCar();
}
public void TestRun() { car.Run(); }
public void TestTurn(Direction d) { car.Turn(d); }
public void TestDeep() { car.Deep(); }
public void TestStop() { car.Stop(); }
}
客户程序调用:
class AppClient {
static void Main(string[] args)
{
//从配置文件中动态加载具体汽车生产工厂的dll,保证了客户代码的稳定性;即当你的应用程序
//版本升级时,你只需要将改变的dll给用户,或者再修改一下配置文件即可扩展此程序
string assemblyName = ConfigurationManager.AppSettings["CarFactoryAssembly"];
string factoryName = ConfigurationManager.AppSettings["CarFactoryName"];
Assembly factoryAssembly = Assembly.Load(assemblyName);
Type factoryType = factoryAssembly.GetType(factoryName);
CarTestFramework carTest = new CarTestFramework();
//carTest.BuildTestContext(new DaZhongFactory());
carTest.BuildTestContext((DaZhongFactory)Activator.CreateInstance(factoryType));
carTest.TestRun();
carTest.TestStop();
carTest.TestTurn(Direction.Right);
}
}
注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考