面向对象设计模式之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 @   JumpByte  阅读(154)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示