抽象类工厂方法

问题描述:

大家早上好! 我有一个视频游戏的实现问题,我会在这里问一些帮助。 我在我的项目中有两种类型的动作,“mainaction”和“quickaction”,它们都有一些可以实现特定方法的子类,例如“execute”。 我想使用工厂方法来实现这种情况,所以我实例化一个名为“Action”的接口,这两个类的动作将实现该接口。抽象类工厂方法

我的问题是关于如何使用工厂在这种情况下,与mainaction和quickaction或者它会更好地实施一个工厂与他们的子类?我该怎么做?

在一般情况下,它始终是指定方法的返回类型为尽可能通用

其实是个好主意,这是使用的工厂,而不是对象本身的构造函数的优势之一:如果返回对象的行为由返回类型指定,那么可以随意更改返回的对象。

如果你通过它的抽象类(或者最好是接口,也许其他人可以在这里给出输入)引用一个类,你可以稍后决定从工厂返回一个完全不同的对象,只要它是子类抽象类的类型/实现工厂方法返回的接口。换句话说,客户端代码不受“动作”类实现细节变化的影响,因为所有与动作类的通信都通过工厂方法返回类型的接口。

直接回答你的问题

如果MainActionQuickAction是相关的,这意味着他们将在相当类似的设置,可用于相当类似的目的,我会为他们创造一个工厂,与工厂方法返回返回子类型的Action。这样您就可以尽可能多地从客户端隐藏实现细节。另外,你所指的行动类也是一种可行的方式。

如果MainActionQuickAction代表了非常不同的概念,但是我只是在它们各自的类中实现了一些静态工厂方法,而不用担心工厂。我的理由是,为两种不同类型的对象创建一个工厂将导致工厂的low cohesion。提到使用相同接口不提供相同功能的不同概念是指定过于普通的返回类型的示例。

但是,请注意,我从我相当有限的经验中吸取教训。

我推荐阅读Joshua Bloch的'Effective Java',我从那本书中学到了很多东西。

+0

虽然我对你的评论没有特别的分歧,但它们并不构成对问题的回答(即使在编辑之后)。 –

+0

@John那么我可能会误解这个问题。你能详细说明一下吗? – SecularisticSloth

+0

OP似乎已经掌握了工厂/工厂方法模式的概念,它们的一般形式以及它们使用的原因,这些是您的答案所解决的主要问题。 OP的问题是双重的:工厂应采取什么具体形式,以及如何实施。实际上这不是一个特别好的问题,因为它太宽泛了。 –

如果你的客户只需要在IAction中声明的方法,那么让工厂返回IAction。例如,

public static IAction Create(string details) {...} 

如果您的客户需要特定于QuickAction和MainAction的方法,那么在工厂中有2个方法。例如,

public static MainAction CreateMainAction(string details) {...} 
public static QuickAction CreateQuickAction(string details) {...} 

这些方法的实现使用details来创建特定的子类。客户不应该需要施放;相反,他们依赖于多态性。