简单工厂的基本工作流程是:
上层应用发出请求,我想要一个实例 ----> 工厂接受到请求,创建一个实例 ----> 工厂将实例返回给上层 ----> 上层应用成功拿到想要的实例,结束
单看工作流,你可能觉得他好像和工厂方法模式非常相似,但是其实,他俩针对的点却是不同的。关于简单工厂模式的实现,我举一个小商店的例子来进行演示:
首先,先说明需求,假设我们的商店只经营一种商品,但是具体卖的是什么商品,我们希望上层是不知情的,而是下层来指定,且可以随意的更改,更改的时候,所有的代码不用发生一丝一毫的改变(不改变不加减任何代码),那我们该如何做呢?
首先,我们先定义一个接口 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。这样就实现了,当我们想修改的时候,无需修改任何代码,一个配置文件,即可灵活的切换需求,实现程序的可配置。
目前我们实现的时候程序的可配置,但他并不提供扩展。如果希望将来这些代码,还能可扩展,关于这个,请看下一篇文章,工厂方法模式。