请注意,其他一些答案可能可以描述工厂,但不能描述 GOF Factory Pattern 。
现在,我想用工厂模式替换此行,尽管我不确定,因为我的TestMode构造函数需要一个额外的对象,而且我不确定需要在哪里传递此值。
好吧,您可以这样想:MainMode(而不是TestMode)是一种执行特殊 *** 作的程序。它要做的特殊事情是 忽略
给定的数字,以确保它确实是随机的。通过这种思考方式,MainMode可以做更多的事情。
或者,如果除了随机性之外,MainMode和TestMode没有不同,那么您可能会认为可以将相似性分解为一个类,这是计算随机数的两种策略之一。一种策略实际上是随机的,而另一种则是错误的,其随机范围仅为1个值。
但让我们假设MainMode和TestMode之间还有其他区别-大概是TestMode将额外的调试输出到System.out或其他东西。
我们仍然可以从测试或玩游戏中排除“我们如何提供随机性”。这些都是 正交的 问题。
因此,现在我们知道,除了“模式”所做的一切之外,它还应该接受随机性策略。然后,例如,当您被告知标准平台随机性还不够真正随机时,您可以使用更好的随机性来代替它。
或者,您可以进行测试,其中将随机范围限制为仅两个选择,或者始终从一到零交替,或者在每次调用时返回某个Vecrtor或Iterator中的下一个值。
因此,我们使用GOF策略模式来构建随机性策略:
interface RandomStrategy { public double random();}public class NotSoRandom implements RandomStrategy { private double r; public NotSoRandom( final double r ) { this.r = r; } public double random() { return r; }}public class PlatformRandom implements RandomStrategy { public double random() { return Math.random(); }}
现在,如果您的整个应用仅创建了一个“模式”,则无需工厂。当您需要一遍又一遍地创建相同的类类型时,可以使用工厂;实际上,工厂只是用于创建正确种类的(子)类的策略。
在生产代码中,我曾使用过一些工厂,这些工厂中有一些通用类可以创建东西,并且我需要告诉如何创建正确的子类来创建。我经过一家工厂。
现在,我们为“模式”创建工厂模式;这将令人惊讶地类似于“策略”模式:
abstract class Mode() { private RandomStrategy r; public Mode( final RandomStrategy r ) { this.r = r; } // ... all the methods a Mode has}public class MainMode implements Mode { public MainMode( final RandomStrategy r ) { super(r); }}public class TestMode implements Mode { public TestMode( final RandomStrategy r ) { super(r); }}interface ModeFactory{ public Mode createMode( final RandomStrategy r );}public class MainFactory() { public Mode createMode( final RandomStrategy r ) { return new MainMode(r); }}public class TestFactory() { public Mode createMode( final RandomStrategy r ) { return new TestMode(r); }}
现在,您了解了工厂模式和策略模式,以及它们在“形状”方面的相似之处,但在用法上却有所不同:工厂模式是对象创建的,它返回要使用的对象;策略是对象行为的,通常会显式创建一个实例,并保留对该实例的引用以封装算法。但是就结构而言,它们非常相似。
编辑:OP在评论中询问“如何将其集成到我的GUI中?”
好吧,除了“模式”,所有这些都不属于程序的GUI。您将创建ConcreteStrategy,然后在某些设置例程中将其传递给首选的Factory,并可能根据命令行参数或配置文件确定要使用哪个。基本上,您会在选择原始帖子中的正确类别时非常选择正确的工厂。
再说一次,如果您只创建其中之一,则不需要Factory。 工厂用于批量生产(或创建相关具体类型的族,尽管这超出了此问题的范围)。
(假设我们有一个游戏,用户可以在命令行上选择是与机器人还是与龙搏斗;然后我们要实例化一个产生对手(接口)的OpponentFactory,并派生类RobotOpponent和DragonOpponent,并传递该工厂游戏中会生成NewOpponent()的部分。类似地,用户可能会选择勇敢或怯ward的对手(我们将其设置为策略)。我们不需要制作更多的策略实例,因为策略通常是幂等的(无状态和单例)。)
static int main( String[] args ) {// setup game worldfinal RandomStrategy r = "random".equals(args[0]) ? new PlatformRandom() : new NotSoRandom( Integer.intValue(args[0]) ) ;// notice the simlarity to the pre you originally posted;// we factored out how to achieve "randomness" as a Strategy.// now we will use our Strategy to setup our Factory;final ModeFactory f = "test".equals(args[1]) ? new TestFactory(r) : new MainFactory(r);// also similar to your pre// we've just added an extra level of indirection: // instead of creating a Mode, we've created an object that can create Modes// of the right derived type, on demand.// call something that uses our factoryfunctionThatRunsameAndNeedstoProduceModesWhenevertNeedsTo( f );}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)