Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 策略模式:实例还是对象类?_Design Patterns_Instance - Fatal编程技术网

Design patterns 策略模式:实例还是对象类?

Design patterns 策略模式:实例还是对象类?,design-patterns,instance,Design Patterns,Instance,这更像是一个道德问题,但我对此很好奇 因此,这里有一个策略模式,其中您有一个包含多个实现和一组方法的策略接口,以策略接口为参数 让我们假设以下内容作为示例: 界面:搜索策略 Class:StringSearch实现搜索策略 Class:IntSearch实现搜索策略 等 还有一种方法是 doSearch(字符串a、字符串b、搜索策略) 您将如何处理策略对象?传递实例,还是传递类 答:doSearch(“你好”,“世界”,新StringSearch()) 或 B:doSearch(“你好”,“

这更像是一个道德问题,但我对此很好奇

因此,这里有一个策略模式,其中您有一个包含多个实现和一组方法的策略接口,以策略接口为参数

让我们假设以下内容作为示例:

  • 界面:搜索策略
  • Class:StringSearch实现搜索策略
  • Class:IntSearch实现搜索策略
还有一种方法是

doSearch(字符串a、字符串b、搜索策略)

您将如何处理策略对象?传递实例,还是传递类

答:
doSearch(“你好”,“世界”,新StringSearch())

B:
doSearch(“你好”,“世界”,StringSearch.class)

因此,创建一个实例并传递它,或者传递类对象并让方法创建一个实例。更好、更干净的方法是什么


表演怎么样?当然,在功能强大的服务器上,性能不会有显著差异,但是对于只有少量资源和较慢处理器的嵌入式系统呢?

传递一个实例。您可能希望传入一个使用参数预实例化的实例(例如,数据库连接),但不能通过传递类本身来实现


如果您希望代码创建新实例(但随后要传递工厂),或者希望执行某种反射类型的机制,那么我希望传递一个类,但这些场景非常少。

当然是实例。传递该类将强制
doSearch()
方法使用反射实例化Strategy对象。只有当所有类都同意某些约定(比如有一个默认构造函数)时,这才有效

而且它不允许传递具有某种状态的策略(比如区分大小写的标志,或者对另一个上下文对象的引用,等等)


我看不出性能与此有什么关系

在Java中,我没有看到StringSearch和IntSearch实现相同接口并允许
doSearch
互换调用它们的方法。我的示例可能不是最好的,但它仍然只是一个示例。再看一眼,根本不需要IntSearch;)