zoukankan      html  css  js  c++  java
  • 面向对象设计模式之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#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考



     

  • 相关阅读:
    Java注解入门
    两种求素数
    几个经典的递归小程序
    Java8新特性——接口的默认方法和类方法
    SSH框架总结
    初识SSH框架
    Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的
    使用SQL查询所有数据库名和表名
    mybatis中#{}和${}的区别
    SOCKET, TCP/UDP, HTTP, FTP 浅析
  • 原文地址:https://www.cnblogs.com/yja9010/p/3178778.html
Copyright © 2011-2022 走看看