• IOC简单工厂


    のDIP(依赖倒置原则)

    简单说就是上层模块不应该依赖于下层模块,二者应该通过抽象去依赖。

    上层就是指调用者,下层就是者被调用方。

    #依赖

    创建一个控制台程序,创建两个类Fashi,Sheshou(类有一个属性和方法)

     public class Fashi
        {
            public string name { get; set; }
            public Fashi(string _name)
            {
                name = _name;
            }
            public void Action()
            {
                Console.WriteLine("*********************************************");
                Console.WriteLine(this.GetType()+":" +this.name + "在中路施法");
                Console.WriteLine("*********************************************");
            }
        }
     public class Sheshou
        {
            public string name { get; set; }
            public Sheshou(string _name)
            {
                name = _name;
            }
            public void Action()
            {
                Console.WriteLine("*********************************************");
                Console.WriteLine(this.GetType()+":"+this.name+"在下路输出");
                Console.WriteLine("*********************************************");
            }
        }

    常规调用是创建一个类的实例对象,再通过实例对调用方法。这里Program类就是依赖于Fashi和Sheshou类

    class Program
        {
            static void Main(string[] args)
            {
                Fashi MZ = new Fashi("墨子");
                Sheshou LB = new Sheshou("鲁班");
                MZ.Action();
                LB.Action();
                Console.ReadKey();
            }
        }

    #接口

    对上面进行改造,创建一个接口IRole(只有一个Action方法),Fashi和Sheshou继承并实现这个接口

    interface IRole
        {
            void Action();
        }
     public class Fashi:IRole
        {
            public string name { get; set; }
            public Fashi(string _name)
            {
                name = _name;
            }
            public void Action()
            {
                Console.WriteLine("*********************************************");
                Console.WriteLine(this.GetType()+":" +this.name + "在中路施法");
                Console.WriteLine("*********************************************");
            }
        }
    class Program
        {
            static void Main(string[] args)
            {
    
                IRole MZ = new Fashi("墨子");
                IRole LB = new Sheshou("鲁班");
                MZ.Action();
                LB.Action();
                Console.ReadKey();
            }
        }

    #简单工厂

    上面在实例化的时候左边被替换成了IRole接口但是右边仍然是具体的类。我们再来升级改造一下,

    配置文件配置相关的信息,通过key可以找到对应的Dll和类  

    [App.config]

    <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> </startup> <appSettings> <add key="Fashi" value="IOC,IOC.Fashi"/> <add key="Sheshou" value="IOC,IOC.Sheshou"/> </appSettings> </configuration>

    创建一个工厂类,创建实例的工作由工厂去做,这里通过读取配置文件+反射实现。我们只需要传入一个key以及创建实例的构造函数的参数(可选参数)

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace IOC
    {
        public static class SimpleFactory
        {
            public static string DllName;
            public static string TypeName;
    
    
            public static T CreateInstance<T>(string key,string name=null)
            {
                DllName = ConfigurationManager.AppSettings[key].Split(',')[0];
                TypeName = ConfigurationManager.AppSettings[key].Split(',')[1];
                Assembly assembly= Assembly.Load(DllName);
                Type type=assembly.GetType(TypeName);
                object obj= Activator.CreateInstance(type,name);
               return (T)obj;
            }
    
        }
    }

    控制台调用。可理解为当遇到实现IRole接口的类时,工厂会根据你提供的key和参数去创建对象实例

     class Program
        {
            static void Main(string[] args)
            {
    
                IRole ZJ = SimpleFactory.CreateInstance<IRole>("Fashi", "甄姬");
                IRole HY = SimpleFactory.CreateInstance<IRole>("Sheshou", "后羿");
                ZJ.Action();
                HY.Action();
                Console.ReadKey();
            }
        }
  • 相关阅读:
    菜刀失效以后得到web的方法
    mimikatz使用
    hydra使用教程
    web安全学习-攻击会话管理
    web安全学习-验证机制存在的问题
    web安全学习-绕过客户端限制
    基于MaxCompute/Dataworks实现数据仓库管理与全链路数据体系
    tensorflow学习|基于TF-IDF的垃圾短信预测
    WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
    CentOS7下安装CDH,clouderamanager,hadoop
  • 原文地址:https://www.cnblogs.com/berlinman/p/10584927.html
Copyright © 2020-2023  润新知