为了账号安全,请及时绑定邮箱和手机立即绑定

使用工厂模式时如何保护具体子类的实例化?

使用工厂模式时如何保护具体子类的实例化?

紫衣仙女 2022-07-20 12:19:49
我有一个Employee带有两个具体子类的抽象类,MinorEmployee并且AdultEmployee. 我知道如何在Employee实例化具体子类的实例中创建静态工厂方法:public abstract class Employee() {    public static Employee create(LocalTime birthdate) {        if (/* omitted */) {            return new MinorEmployee();        } else {            return new AdultEmployee();        }    }}Java中有没有办法防止同一个包中的调用者直接实例化 a MinorEmployeeor AdultEmployee?我不能将他们的构造函数设为私有,或者Employee无法访问它们。我也不想将它们嵌套在Employee.
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

我可以给你一些你可以尝试的提示,尽管可能有一些警告:

  • 创建一个单独的工厂类而不是基类。

  • 在工厂类中将构造函数设为私有

  • 在工厂类中实例化一个虚拟私有对象

  • MinorEmployeeandAdultEmployee的唯一构造函数接受工厂类的对象。由于私有构造函数,工厂对象不能存在于类之外,实际上没有其他人应该能够从外部实例化这些类。

  • 使用虚拟对象在您的工厂方法中传递。


查看完整回答
反对 回复 2022-07-20
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

另一种方法是:

您可以将构造函数设为私有并使用辅助方法来识别新实体的请求来自何处。如果来自您想要的地方,则返回对象的新实例,否则您可以抛出异常。


查看完整回答
反对 回复 2022-07-20
?
holdtom

TA贡献1805条经验 获得超10个赞

MinorEmployee您可以在和AdultEmployeeas中声明构造函数,private然后在您的工厂方法中使用反射:


public static Employee create(LocalTime birthdate) {

    try {

        Class<? extends Employee> clazz;

        if (omitted) {

            clazz = MinorEmployee.class;

        } else {

            clazz = AdultEmployee.class;

        }

        Constructor<? extends Employee> cons = clazz.getConstructor();

        cons.setAccessible(true);

        return cons.newInstance();

    } catch (NoSuchMethodException | SecurityException

            | InstantiationException | IllegalAccessException

            | InvocationTargetException ex) {

        // handle the exception

    }

}    


查看完整回答
反对 回复 2022-07-20
  • 3 回答
  • 0 关注
  • 269 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号