工厂模式实现三种方式 实现工厂模式的方式有以下三种: 1。简单工厂模式:通过一个工厂类来创建对象实例,客户端只需提供所需产品的类型即可。实现方式比较简单,但是不够灵活,新增产品时需要修改工厂类。 2。工厂方法模式:将工厂类抽象成一个接口,让子类来决定具体创建哪个产品。客户端只需知道工厂接口和相应产品接口即可。更加灵活,但是需要定义大量的接口和类。 3。抽象工厂模式:用于创建一系列相关的产品对象,为这些产品提供一个共同的接口。客户端只需要知道抽象工厂接口和相应产品接口即可。适用于产品族的创建。一、简单工厂模式 简单工厂模式是创建型设计模式之一,它通过一个工厂类来创建对象实例,而不是直接使用new关键字来实例化对象。在该模式中,客户端只需知道所需产品的类型即可,而无需关心实际的实现细节。 简单工厂模式适用于以下场景: 1。需要创建的对象较少,不会经常增加新的产品。 2。客户端只需要知道所需产品的类型,而无需关心实现细节。 3。类的创建过程比较简单,且客户端无需知道类的创建细节。 在。NETCore源码中,简单工厂模式的应用非常广泛,例如: 1。System。Configuration。ConfigurationManager类中的GetSection()方法,用于获取指定配置节的信息。 2。System。IO。File类中的Create()方法,用于创建指定文件的FileStream对象。 3。System。Net。WebRequest类中的Create()方法,用于创建WebRequest对象。 以上这些方法都是使用简单工厂模式实现的,它们根据参数类型的不同来创建不同的对象实例。简单工厂模式在。NETCore源码中的实现事例publicinterfaceILogger{voidLog(stringmessage);}publicclassFileLogger:ILogger{publicvoidLog(stringmessage){Console。WriteLine(34;Loggingtofile:{message});}}publicclassDatabaseLogger:ILogger{publicvoidLog(stringmessage){Console。WriteLine(34;Loggingtodatabase:{message});}}publicstaticclassLoggerFactory{publicstaticILoggerGetLogger(stringloggerType){switch(loggerType。ToLower()){casefile:returnnewFileLogger();casedatabase:returnnewDatabaseLogger();default:thrownewArgumentException(34;Invalidloggertype:{loggerType});}}}使用示例ILoggerloggerLoggerFactory。GetLogger(file);logger。Log(Hello,world!); 在上面的例子中,我们定义了一个ILogger接口和两个实现类FileLogger和DatabaseLogger。然后通过LoggerFactory工厂类来创建具体的ILogger实例,客户端只需要提供所需的loggerType参数即可。在使用时,先通过工厂类获取对应的实例,然后调用其Log()方法输出日志。工厂方法模式在。NETCore源码中使用 一个典型的例子就是EFCore中的DbContext类。DbContext用于与数据库交互,而不同的数据库需要使用不同的数据库提供程序(或称为数据驱动程序)。EFCore的工厂方法模式实现了让用户自行选择所需数据库提供程序的功能。 下面以SQLite数据库提供程序为例,演示EFCore中工厂方法模式的实现: 首先,定义一个抽象的DbContext工厂类:publicabstractclassDbContextFactory{protectedabstractDbContextCreateNewInstance(stringconnectionString);publicDbContextCreate(stringconnectionString){returnCreateNewInstance(connectionString);}} 然后,定义一个具体的SQLiteDbContextFactory工厂类,继承自抽象工厂类,并实现具体的CreateNewInstance()方法,用于创建SQLite数据库的DbContext实例:publicclassSQLiteDbContextFactory:DbContextFactory{protectedoverrideDbContextCreateNewInstance(stringconnectionString){varoptionsBuildernewDbContextOptionsBuilderSQLiteDbContext();optionsBuilder。UseSqlite(connectionString);returnnewSQLiteDbContext(optionsBuilder。Options);}} 注意到上述代码中,我们通过DbContextOptionsBuilder类创建了DbContext的选项,并将其传递给实际创建实例的构造函数。 最后,使用时,只需要先创建一个具体的DbContextFactory实例,然后调用其Create()方法创建所需的DbContext实例即可:varfactorynewSQLiteDbContextFactory();varcontextfactory。Create(DataSourceexample。db); 在上述代码中,我们创建了一个SQLiteDbContextFactory实例,并使用其Create()方法创建了一个SQLite数据库连接的DbContext实例。 总之,工厂方法模式是一种很常见的设计模式,在。NETCore中得到了广泛应用。DbContext工厂也是其中的一个经典例子。抽象工厂模式在。NETCore中也有应用 最常见的就是ADO。NET中的数据提供程序(DataProvider)。 首先,定义一个抽象的DbProviderFactory类,表示一个通用的数据库提供程序工厂:publicabstractclassDbProviderFactory{publicabstractDbCommandCreateCommand();publicabstractDbConnectionCreateConnection();publicabstractDbParameterCreateParameter();} 注意到上面的DbProviderFactory类中定义了三个抽象方法,分别用于创建DbCommand、DbConnection和DbParameter对象。这些对象都是和数据库相关的核心对象。 接着,定义一个具体的SqlClientFactory类,继承自抽象工厂类,并实现具体的Create()方法,用于创建MicrosoftSQLServer数据库提供程序的对象:publicclassSqlClientFactory:DbProviderFactory{publicoverrideDbCommandCreateCommand(){returnnewSqlCommand();}publicoverrideDbConnectionCreateConnection(){returnnewSqlConnection();}publicoverrideDbParameterCreateParameter(){returnnewSqlParameter();}} 类似的,还可以定义其他的具体工厂类,用于创建不同的数据库提供程序对象。 最后,在使用时,只需要先创建一个具体的DbProviderFactory实例,然后调用其Create()方法即可创建所需的对象(如DbCommand、DbConnection等): 创建一个SQLServer数据库提供程序工厂实例varfactorySqlClientFactory。I使用该工厂创建对象using(varconnectionfactory。CreateConnection()){connection。ConnectionStringconnectionSconnection。Open();using(varcommandfactory。CreateCommand()){command。CommandTextSELECTFROMCcommand。Cusing(varreadercommand。ExecuteReader()){while(reader。Read()){读取数据}}}} 上述代码中,我们首先创建了一个SqlClientFactory实例,然后使用该实例创建了SqlConnection和SqlCommand对象。注意到,在使用DbCommand和DbConnection等对象时,并没有直接写明其具体的类型,而是通过DbProviderFactory提供的抽象方法进行了创建,这正是抽象工厂模式的精髓所在。 综上,抽象工厂模式在。NETCore中得到广泛应用,尤其是在ADO。NET数据提供程序中。通过使用抽象工厂模式,我们可以轻松地切换不同的数据库提供程序,加强了系统的灵活性和可扩展性。