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