zoukankan      html  css  js  c++  java
  • C# 工厂模式 个人基本流程

    有个前提

    本文并不会介绍工厂模式,只是记录在实际当中个人比较喜欢的工厂写法。仅仅作为备忘和参考。

    开始流程

    定义一个抽象类,包含一些公共的业务逻辑(也可以是接口)

    /// <summary>
    /// 业务的基类,包含一些公共的业务逻辑
    /// </summary>
    abstract class BaseClass
    {
        protected BaseClass() { }
    
        public virtual void Print()
        {
            throw new InvalidOperationException();
        }
    }

     然后定义一个具体业务

    class ClassA:BaseClass
    {
        public override void Print()
        {
            Console.WriteLine("233333333333");
        }
    }

    写一个枚举,包含很多业务分类

    enum MyEnum
    {
        // 主要编写一些具体的业务参数,传递这个就可以找到对应的业务
        A,
        B
    }

     写一个工厂接口,包括枚举和创建返回

    interface IFactoryHandler
    {
        MyEnum TypEnum { get; }
    
        BaseClass Create();
    }

    写一个用到这个工厂接口的类,用于创建具体业务

    class A : IFactoryHandler
    {
        public MyEnum TypEnum { get; } = MyEnum.A;
        public BaseClass Create()
        {
            return new ClassA();
        }
    }

    最后利用反射方法,把枚举和具体业务一一对应

    public class Factory
    {
        //反射到所有用到这个接口的类
        private Factory()
        {
            var type = typeof(IFactoryHandler);
            var instances = from t in Assembly.GetExecutingAssembly().GetTypes()
                where t.GetInterfaces().Contains(type)
                select Activator.CreateInstance(t) as IFactoryHandler;
            FactoryList = instances.ToArray();
        }
    
        private IFactoryHandler[] FactoryList { get; }
    
        public BaseClass Create(MyEnum type)
        {
            try
            {
                var factoryHandler = FactoryList.Single(x => x.TypEnum == type).Create();
                return factoryHandler;
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("无效的操作,工厂和参数不匹配", e);
            }
        }
    }

    白嫖链接

    https://github.com/yinghualuowu/SakuraStuffPack/tree/master/SakuraStuffPack/SakuraStuffPack/Factory

  • 相关阅读:
    说文解字 —— 拆字
    4K 对齐与固态硬盘检测工具
    硬盘分区(主分区、扩展分区、逻辑分区)
    python+caffe训练自己的图片数据流程
    亲和数(220/284)
    浅谈多进程多线程的选择
    Linux下的多线程编程
    LINUX-进程的概念
    Linux终端那件事儿
    Linux的终端类型
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/12635544.html
Copyright © 2011-2022 走看看