带抽象类的工厂方法

时间:2016-05-15 11:58:34

标签: java design-patterns factory factory-method

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

我的问题是关于如何在这种情况下使用工厂,使用mainaction和quickaction,或者最好用它们的子类实现工厂?我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

通常,将方法的返回类型指定为尽可能通用是一个好主意

实际上,这是使用工厂而不是对象本身的构造函数的优势之一:如果返回的对象的行为是由返回类型指定的,那么您可以自由地更改返回的对象。你要。

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

直接回答您的问题

如果MainActionQuickAction相关,意味着它们将在相当类似的设置中使用,我会为它们创建一个工厂,工厂方法返回返回的子类型{{ 1}}。这样,您可以从客户端隐藏尽可能多的实现细节。此外,您可以通过一种方式指代动作类。

如果ActionMainAction代表截然不同的概念,我只会在各自的类中实现一些静态工厂方法,而不用工厂。我的理由是,为两个不同类型的对象创建工厂将导致工厂low cohesion。引用不使用相同接口提供相同功能的不同概念是指定过于通用的返回类型的示例。

但请注意,我的经验相当有限。

我建议阅读Joshua Bloch撰写的“Effective Java”,我从那本书中学到了很多东西。

答案 1 :(得分:0)

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

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

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

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

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