服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#的静态工厂方法与构造函数相比有哪些优缺点

C#的静态工厂方法与构造函数相比有哪些优缺点

2022-09-22 15:40芝麻麻雀 C#

这篇文章主要介绍了C#的静态工厂方法与构造函数对比的优缺点,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

最近,在与同事进行协同编程时,我们开始讨论在C#中初始化新对象的最佳方法。我一直是使用构造函数实现,尽管他倾向于静态工程方法。这引起了关于每种类型的利弊的大量来来回回的讨论。

为了说明我所说的内容,这是两个例子:

?
1
2
3
4
// Using the constructor
SqlConnection myConnection = new SqlConnection(connectionString);
// Using a static factory method
IDbConnection myConnection = SqlConnection.FromConnectionString(connectionString);

之前我从未考虑过实现这些静态工厂方法,我并自嘲问不了解其内容。自从那以后,我改变了注意,让我们深入探讨其优缺点。

静态工厂方法的优点

无须返回一个新的实例

而构造函数总是返回一个新的对象。

当新对象创建失败时,你不能使用一个缓存的对象或返回 null。特别是在编写库代码时,将来可能会很灵活。

你可以使用方法参考

如果你倾向于以一种实用的方式编写C#,你可能会感激你可以在代码中传递该方法(或正式称为“方法组”)的引用。对比一下:

?
1
2
3
4
5
// Static factory method - the method group can be passed in directly as a function reference
var bars = myFoo.Select(bar.FromFoo)
// Constructors - you have to pass in a lambda that constructs the instance via new.
var bars = myFoo.Select(f => new Bar(f));

这段代码没有功能上的差异,只是代码风格上的一个问题。因此可能不应在决策中过分重视。

你能通过名字了解

对于某些对象,尤其是可以通过多种类似方式构造的对象-能够在构造对象的方式上获益良多。让我们以Color类为例,该类可以通过CMYK和RGB参数构造。

?
1
2
3
4
5
6
7
// With constructors
var color = new Color(25, 25, 5, 80);
var color = new Color(100, 150, 50);
// With static factory methods
var color = Color.FromCMYK(25, 25, 5, 80);
var color = Color.FromRGB(100, 150, 50);

与更具描述性的静态工程方法进行对比,除非你知道Color的四个值的构造函数是CMYK,三个值的构造函数是RGB,否则无法通过阅读代码来区别出来。

我认为,如果你有不同的构造对象的方式,尤其是参数彼此相似的方式,有很充分的理由来使用静态工厂方法。

工厂方法可以返回不同的类

new Foo()总是返回一个Foo类的一个新的实例,Foo.FromBar很容易的返回一个IFoo接口,或者Foo的一个子类。一个可能与之相关的真实示例:

?
1
2
3
4
5
// This could create an IpV4IpAddress that implements IIpAddress
IIpAddress ipv4Address = IpAddress.FromString("127.0.0.1");
 
// This could create an IpV6IpAddress that implements IIpAddress
IIpAddress ipv6Address = IpAddress.FromString("2001:0db8:0a0b:12f0:0000:0000:0000:0001")

在提供公共API(例如在库上下文中)时,能够根据输入返回不同的实际类型可能非常有价值。特别是因为这意味着你可以在接口或者基类后面隐藏一些实现细节。

我不确定应用程序代码中的价值是否一样大,你可以在其中控制整个库代码,并使大规模重构变得更加容易。

在构造函数中你不应该做的事情

通常,人们并不期望构造函数除了构造对象之外,还能做其他很多事情。你管你可以在构造函数中执行I/O,数据库访问等操作,但大多数人并不期望这样做。按照惯例,你可以自由的以静态工厂方法执行更多的工作,而无需任何人引起注意。

有些人也不认为你应该在构造函数中抛出异常。也许这取决于语言,但在C#中完全可以,如果要在构造函数中创建非托管资源,请注意一下几点。

静态工厂方法的缺点

在构造函数中不应该做的事情

按照惯例,构造函数通常更简单。当我调用构造函数时,通常不希望它执行I/O或
其他。这使构造函数的构造灵活性大大降低,这既是福也是祸。

意味着更多代码

无论如何,你仍然需要构造函数来实际构造对象。静态工厂方法是更多的代码,而代码是一中责任。它通常不是很复制的代码,并且通常静态工厂方法也不是特别长,因此这可能不是一个很大的缺点。

很难找到

通常,当我尝试构造一个新对象时,我会先寻找构造函数。通过自动完成功能很难找到静态方法,因为他们通常无法与其他静态方法区分开。

我认为静态方法最大的问题是你失去了可发现性。

经过研究和思考之后,我认为我目前的看法是:

  • 你应该始终创建一个构造函数,该构造函数将1:1映射到类内部的字段
  • 如果你需要花很多实践来创建对象(例如IO),或者对缓存对象并重新使用它们感兴趣,请使用静态工厂方法。
  • 如果你需要API稳定(例如用于库开发),请隐藏该构造函数并使用静态工厂方法,因为它为你提供了实现的灵活性.
  • 如果你有多种不同的方法来创建类,请创建静态工厂方法并使用它们,因为它们为你提供了描写性.

以上就是C#的静态工厂方法与构造函数相比有哪些优缺点的详细内容,更多关于C# 静态工厂方法与构造函数的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/sesametech-netcore/p/12360190.html

延伸 · 阅读

精彩推荐
  • C#非常实用的C#字符串操作处理类StringHelper.cs

    非常实用的C#字符串操作处理类StringHelper.cs

    这篇文章主要为大家详细介绍了非常实用的C#字符串操作处理类StringHelper.cs,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    sanler7832022-01-17
  • C#C#中Byte[]和String之间转换的方法

    C#中Byte[]和String之间转换的方法

    很多朋友不清楚如何在Byte[]和String之间进行转换?下面小编给大家带来了byte与string转换的方法,感兴趣的朋友参考下吧...

    鞠帅7912021-12-02
  • C#详解C#中==、Equals、ReferenceEquals的区别

    详解C#中==、Equals、ReferenceEquals的区别

    C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等,本篇文章详解C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等...

    学习也休闲网6762021-12-11
  • C#C#学习笔记- 随机函数Random()的用法详解

    C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网6082021-12-03
  • C#C# BackgroundWorker使用教程

    C# BackgroundWorker使用教程

    这篇文章主要为大家详细介绍了C# BackgroundWorker使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    五维思考3332022-03-01
  • C#逐步讲解快速排序算法及C#版的实现示例

    逐步讲解快速排序算法及C#版的实现示例

    快速排序在时间复杂度同为O(N*logN)的几种排序方法中效率较高,因而比较常用,接下来这里就来逐步讲解快速排序算法及C#版的实现示例...

    MoreWindows5712021-11-25
  • C#C#RSA对接JAVA中RSA方式代码实例

    C#RSA对接JAVA中RSA方式代码实例

    在本篇文章中小编给各位整理的是关于C#RSA对接JAVA中RSA方式代码实例,有需要的朋友们可以参考一下。...

    盛开的雨季5912022-08-04
  • C#C#利用ZXing.Net生成条形码和二维码

    C#利用ZXing.Net生成条形码和二维码

    这篇文章主要为大家详细介绍了C#利用ZXing.Net生成条形码和二维码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Alan.hsiang6152022-02-21