面向对象设计模式之FactoryMethod工厂方法模式(创建型)

动机:当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个, 并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

意图:定义一个用于创建对象的接口,让子类决定实例化 哪个子类。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#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考

 



 

posted @ 2012-02-24 09:44  JumpByte  阅读(149)  评论(0编辑  收藏  举报