沧州三亚菏泽经济预测自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产
菏泽德阳
山西湖州
宝鸡上海
茂名内江
三亚信阳
长春北海
西安安徽
黄石烟台
沧州湛江
肇庆鹤壁
六安韶关
成都钦州

设计模式之工厂模式。NETCore源码中的使用

9月21日 栀璃鸢投稿
  工厂模式实现三种方式
  实现工厂模式的方式有以下三种:
  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数据提供程序中。通过使用抽象工厂模式,我们可以轻松地切换不同的数据库提供程序,加强了系统的灵活性和可扩展性。
投诉 评论

车辆侧翻损失如何赔偿在驾车过程中难免出现一些交通意外事故,车辆侧翻的情况也很多见。一旦出现车辆侧翻事故之后,车体肯定会受到严重损害,善后事宜之后接下来的事情就是保险理赔了。车辆侧翻损失如何赔偿?下……格林童话一只眼两只眼和三只眼故事原文欣赏一只眼、两只眼和三只眼从前有一个妇人,她有三个女儿。大女儿叫一只眼,因为她只有一只独眼,长在额头中央;二女儿叫两只眼,因为她和普通人一样只有两只眼睛;最小的女儿叫三只眼,……微波炉对孕妇有辐射吗微波炉在使用的时候就会释放出辐射,微波炉主要是利用微波进行食物的加热,微波炉辐射其实就是微波辐射,那么微波辐射孕妇吗?微波炉的电磁辐射并不比电脑少,微波炉的辐射对孕妇的伤……生死战!国足今晚11点对阵阿曼热点聚焦:朱广沪:国家队主帅压力大很正常李铁正面临考验近日,前国足主帅朱广沪在出席活动时分享了自己对于国家队主帅工作的看法,并谈到了昔日爱徒李铁目前所面临的压力。老……设计模式之工厂模式。NETCore源码中的使用工厂模式实现三种方式实现工厂模式的方式有以下三种:1。简单工厂模式:通过一个工厂类来创建对象实例,客户端只需提供所需产品的类型即可。实现方式比较简单,但是不够灵活,……好消息,国乒又有比赛了!国乒派出8名年轻球员,将刮起青春风暴好消息,好消息,国乒又有比赛了。翻看WTT世界乒联官网,WTT常规赛萨格勒布站将于6月13日19日举行,离现在还有25天。让国内球迷感到开心的是国乒队员将参加本站比赛。……手机充电接口都用TypeATypeB是什么呢?其实更常见现在的安卓手机几乎都是在用Typec接口来进行充电或者传输数据了,但是大家很少听说过TypeA和TypeB吧,其实这两样在咱们日常工作或生活中也是很常见的。下面就来详细介绍一下……冷门频出!NBA巨星在国家队为何就不灵了呢?2022年男篮欧洲杯正值如火如荼之际,四分之一决赛,随着斯洛文尼亚8790不敌波兰,三位NBA顶级球星分别所在的三支球队,都被淘汰干净了。不禁让人感叹,在NBA球队那是绝对核心……死亡2006年10月15日2:44:09人们都惧怕死亡,怕那没有吃觉变成一堆白骨被大地掩埋的意之惧,有为诗人说过这样一段话生有何欢,死有何惧。希梅内斯是以为伟大的诗人,……打开尘封的记忆十七十七三面红旗从年起,连续几年,全国人民都高呼三面红旗万岁!是哪三面红旗呢?第一面红旗是总路线。当时,党中央制定了过渡时期的总路线:鼓足干劲,力争上游,多快好省……旅游及探险中的避险与自救如猛兽已经向人扑过来,可以采取防卫措施,并要注意互相救助。如何从狮口逃生千万不要跑。它很可能已经看到或嗅到了你,跑的话只会令它对你更加注意。把外衣张开,让自己……如何洗白色的衣物除汗渍方法1:将冬瓜一块捣烂,倒进布袋中,将其液汁挤出,用来搓洗沾有汗渍的衣服,然后再用清水漂净。除汗渍方法2:在清水里加几滴氨水,把有汁渍的衣服放进去漂洗一下,再用清水……
没钱你出去挣啊,真没出息,邋里邋遢的,不要来学校找我隔代亲有多亲?外婆只带孩子不管娃,引网友共鸣求同款老人如果未来地球迎来第六次生物大灭绝事件,人类能够逃过一劫吗?2022年2月还没过完,就已有18位名人去世,最年轻的才31签约达成!悍将告别勇士,金州高居联盟第一,库里影响力功不可没应该跪着听的二泉映月为什么老年人身上会长老年斑?医生建议做好4件事,可以有效改善驼色大衣怎么穿更高级?教你4个搭配思路,实用干货,值得学36岁歌手因口腔癌病逝,生前发视频告诫人们珍惜生命,远离槟榔全球先行探路浙江GM2D已覆盖6。7万家市场主体敢让谢娜扛大旗主持浪姐,是需要多么大的勇气父亲去世后妻子接任,公司2次易主,这个淄博人,财富曾达21亿不吃米饭的危害是什么呢体育考试流星雨1日韩彩妆品牌排名(日本有名的彩妆品牌)三月里的粉嫩桃花作文孩子上课多动怎么办?高中经典素材大全最大的财富诚信作文950字踢脚线要和门套颜色一样吗女人过了30岁就开始贬值了吗?(女人年龄上去了就不值钱了?)家庭氛围的好坏对女孩的性格思想习惯有着重要的影响富士X100T支持WIFI吗?富士X100T支持GPS吗?

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找