java - 关于工厂方法模式的澄清

标签 java design-patterns factory factory-pattern software-design

我有一个父类(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/

相关文章:

java - 不要在 Dozer 中将空条目从一个列表映射到另一个列表

java.lang.NoClassDefFoundError : com/itextpdf/kernel/counter/event/IMetaInfo 错误

generics - Kotlin 通用工厂动态转换

angularjs - 将 ui-router $stateParams 传递给 $http 工厂服务

c++ - 工厂方法实现 - C++

java - Apache POI,同时使用 XSSF 和 HSSF

java - (Azure SDK java)如何使用Java程序启用/禁用每个功能

java - 这是一种策略模式还是回调?

go - 设置 Option 对象时不可变 setter 和传统 setter 的区别

design-patterns - 在进行任何编码之前,应进行多少设计?