• SimpleFactory(简单工厂模式)


      简单工厂的基本工作流程是:

      上层应用发出请求,我想要一个实例 ----> 工厂接受到请求,创建一个实例 ----> 工厂将实例返回给上层 ----> 上层应用成功拿到想要的实例,结束

      单看工作流,你可能觉得他好像和工厂方法模式非常相似,但是其实,他俩针对的点却是不同的。关于简单工厂模式的实现,我举一个小商店的例子来进行演示:

      首先,先说明需求,假设我们的商店只经营一种商品,但是具体卖的是什么商品,我们希望上层是不知情的,而是下层来指定,且可以随意的更改,更改的时候,所有的代码不用发生一丝一毫的改变(不改变不加减任何代码),那我们该如何做呢?

      首先,我们先定义一个接口 IProduct

     1     /// <summary>
     2     /// 商品接口
     3     /// </summary>
     4     public interface IProduct
     5     {
     6         /// <summary>
     7         /// 商品展示自己
     8         /// </summary>
     9         void Show();
    10     }

      然后我们的每一件商品都去继承这个接口

     1     /// <summary>
     2     /// 电脑
     3     /// </summary>
     4     public class Computer : IProduct
     5     {
     6         public void Show()
     7         {
     8             Console.WriteLine("我是性价比非常高的电脑");
     9         }
    10     }

      接着,添加一个单例,作为工厂,用来创建实例。

     1     /// <summary>
     2     /// 商品实例工厂
     3     /// </summary>
     4     public static class Factory
     5     {
     6         private static readonly IConfigurationRoot _configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();
     7 
     8         /// <summary>
     9         /// 创建实例
    10         /// </summary>
    11         /// <returns></returns>
    12         public static IProduct CreateInstance()
    13         {
    14             string assemlyName = _configuration["assemblyName"];
    15             string typeName = _configuration["typeName"];
    16             var result = Activator.CreateInstance(assemlyName, typeName).Unwrap();// 反射的形式创建实例    
    17             return result  as IProduct;
    18         }
    19     }

      字段 _configuration ,代表的是一个配置文件读取实例。因为本项目是一个.net core 3.1环境下的控制台程序,所以关于配置文件的读写,需要引用三个包:

       然后在控制台项目中添加一个json文件,属性里面设置为始终复制。

    1 {
    2   "assemblyName": "SimpleFactoryLib",
    3   "typeName": "SimpleFactoryLib.Products.Computer"
    4 }

       最后在上层我们只需要向工厂发出请求即可

    1         static void Main(string[] args)
    2         {
    3             IProduct product = Factory.CreateInstance();
    4             product.Show();
    5 
    6             Console.ReadKey();
    7         } 

      当我们的商店需要更换商品的时候,只需修改配置文件即可,但如果是想额外添加别的商品,也只需把新的商品代码类库的dll文件放入到该控制台项目根目录下,然后配置文件做好相应配置就OK。这样就实现了,当我们想修改的时候,无需修改任何代码,一个配置文件,即可灵活的切换需求,实现程序的可配置。

      目前我们实现的时候程序的可配置,但他并不提供扩展。如果希望将来这些代码,还能可扩展,关于这个,请看下一篇文章,工厂方法模式。

  • 相关阅读:
    Oracle 的日期类型
    简单的同步Socket程序服务端
    MMORPG中的相机跟随算法
    使用了UnityEditor中的API,打包时却不能打包UnityEditor的问题
    C# 中的关键字整理
    Unity3D C#中使用LINQ查询(与 SQL的区别)
    C# 值类型与引用类型的异同
    Unity3D NGUI事件监听的综合管理
    Unity3D 动画状态机简单控制核心代码
    Unity3D判断触摸方向
  • 原文地址:https://www.cnblogs.com/shapman/p/12457159.html
Copyright © 2020-2023  润新知