我有一个父类(super class) LoginUser 和两个扩展 LoginUser 的子类 AdminUser 和 StudentUser。
以前,我在一个类中有两个方法 getAdminUser 和 getStudentUser,我曾经在从数据库获取各自的角色后创建 AdminUser 或 StudentUser 的对象并返回相同的对象。
最近,我尝试实现工厂方法模式:
以下是我的新代码。
public LoginUser getUser(String emailId)
{
SQLCmd cmd = new GetUserIDByEmail(emailId);
cmd.execute();
Integer userId = (Integer)cmd.getResult().get(0);
String userType = cmd.getResult().get(1).toString().toLowerCase();
GetUserDetailsCmd gudCMD = null;
switch(userType)
{
case "student":
{
gudCMD = new GetStudentById(userId);
gudCMD.execute();
break;
}
case "admin":
{
gudCMD = new GetAdminById(userId);
gudCMD.execute();
break;
}
}
return (LoginUser)gudCMD.getResult().get(0);
}
当我调用gudCMD.execute()时,GetAdminById将创建一个AdminUser对象并将其放入列表中。 getStudentById 类似;这就是为什么我输入cast并返回它。
请澄清这是否是工厂方法模式的正确实现。
最佳答案
这不是由 GoF 定义的工厂方法模式的实现。工厂方法是一种抽象方法,它的子类会重写以返回不同的产品实现(例如 StudentUser 或 AdminUser)。为了符合该模式,case
语句中的逻辑将被移动到单独的子类中,并且每个子类都会重写 getUser()
方法。
此示例通常称为“简单工厂”或“具体工厂”,或者如果方法是静态的,则称为“静态工厂”。这些类型的工厂很常见,但并不等同于 GoF 模式。
关于java - 关于工厂方法模式的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683809/