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         } 

猜你喜欢

转载自www.cnblogs.com/shapman/p/12457159.html
今日推荐