我应该使用从可实例化类继承的单例类还是另一种更好的模式?
问题描述:
我有一个名为ArtificialIntelligenceBase的类,您可以从中创建自己的人工智能配置,向构造函数发送一些变量,或者可以创建一个继承自ArtificialIntelligenceBase的类,并在此新类的构造函数中调用函数super( )与配置的参数。我应该使用从可实例化类继承的单例类还是另一种更好的模式?
我还创建了一些人工智能的例子,类,AIPassive,AIAgressive和AIDefensive。显然,它们都是从ArtificialIntelligenceBase继承而来的。
问题是基类中只有少数公共函数。基类中的变量是只读的,如果需要在创建另一个预定义AI时对其应用某些修改,则非公共函数将受到保护。您可以创建另一个AI,只需调用基类,在构造函数中发送一些参数,如下所示:new ArtificialIntelligenceBase(param1,param2,param3,param4);
我已经把这些类作为一个单例,因为类永远不会改变,一旦设置,它们的变量永远不会改变。
问题是:单身人士是否是最好的模式?因为我不确定。
PD:你并不需要解释的任何图案,只是提到名字,我会寻找它是如何工作的
PPD:我在AS3发展。万一它有助于
感谢
答
一般来说,singletons are evil。在你的情况下,我也没有看到任何理由使用单例。这听起来像你使用自己版本的factory method模式(使用某种构造函数?)或者prototype(我不知道AS3有一点),但是如果你正在寻找其他模式,是abstract factory和builder。
尽管如此,您并不需要使用单例模式来限制自己只使用一种类型的实例。这无助于避免冗余。
我虽然关于单身人士避免冗余,因为所有的变量将保持不变。 例如: 一旦我有了新的AIPassive()的实例,要创建其他地方,新的AIPassive()的另一个实例将结束具有完全相同类的2个实例,并且所有变量都是只读的,尽管它可能是有道理的。 – iamnewhere 2011-05-03 23:39:05
@iamnewhere我认为您应该将框架级别的问题与应用程序级别的问题分开。单身人士的大多数缺点是框架级的(像单元测试的麻烦)。另一方面,在意外创建的实例上花费额外资源对于具体,设计良好并经过测试的应用程序来说是个问题。所以我的建议是将必要的工厂方法添加到AI库并为您的应用程序创建单例实例。这会有点脆弱,因为你可以访问工厂方法和单例实例,所以确保整个团队的所有决策都是清晰的。 – CheatEx 2011-05-04 07:48:31