java中的工厂类设计问题

java中的工厂类设计问题,java,design-patterns,Java,Design Patterns,我有两节课 public class PrepaidPackage { private String name; private String serviceClassID; private boolean isTranferable; public boolean isTranferable() { return isTranferable; } public void setTranferable(boolean isTra

我有两节课

public class PrepaidPackage {

    private String name;
    private String serviceClassID;
    private boolean isTranferable;

    public boolean isTranferable() {
        return isTranferable;
    }
    public void setTranferable(boolean isTranferable) {
        this.isTranferable = isTranferable;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getServiceClassID() {
        return serviceClassID;
    }
    public void setServiceClassID(String serviceClassID) {
        this.serviceClassID = serviceClassID;
    }
}
另一类是

public class PostpaidPackage {
    private String name;
    private boolean isTranferable;
    public boolean isTranferable() {
        return isTranferable;
    }
    public void setTranferable(boolean isTranferable) {
        this.isTranferable = isTranferable;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
我想创建一个工厂类,它基于包类型创建相关类。但是如果你看上面的分类,它们没有相同类型的方法和变量。所以,请指导如何为上述类创建接口或抽象类

现在工厂将返回类名包。我是否能够调用其他类中不存在的方法

更新

请建议我把我的包裹分成两类,比如

public abstract class MyPackage {
    public abstract PackageSpec getSpec();
    public abstract PackagePrepaidDetails getDetail();
}
现在,公共属性将出现在PackageSpec中,预付费属性将出现在packageDetails中

它是一种抽象的工厂模式

public class PrepaidPackage extends MyPackage{
    PackageSpec spec;
    public Spec getSpec() {
      spec = new PackageSpec();
      spec.setTranferable(true)
      spec.setName("abc");
      return spec;
    }
    public PackagePrepaidDetails getDetails() {
      details = new PackagePrepaidDetails ();
      details.setServiceClassID(123)
      return details;
    }
}

public class PostpaidPackage extends MyPackage{
    PackageSpec spec;
    public Spec getSpec() {
        spec = new PackageSpec();
        spec.setTranferable(true)
        spec.setName("abc");
        return spec;
    }
}

一个不是理想的快速修复方法是使用一个接口来表示预付费类中的所有方法,而在后付费中不实现它们。这将在短期内解决问题。我建议您重新阅读类和用法,以避免代码中出现未实现的方法。

对于抽象的超类,您必须将两者共有的所有内容分组:

public abstract class MyPackage { // not sure you can call a class just "Package"
    private String name;
    private boolean isTranferable;

    public boolean isTranferable() {
        return isTranferable;
    }
    public void setTranferable(boolean isTranferable) {
        this.isTranferable = isTranferable;
    }
    public String getName() {
       return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
然后两者都从它继承(第一个添加
serviceClassID
,第二个不添加任何内容)


您的factory函数将返回MyPackage(或AbstractPackage,无论什么),但要访问特定函数,您必须在
instanceof
测试后强制转换。

如果您还没有接口,我建议您使用接口。您不一定需要它,但如果它们如此相似,则这是一种良好的做法:

public interface Package {
    public boolean isTranferable();
    public void setTranferable(boolean isTranferable);
    public String getName();
    public void setName(String name);
}
然后在您的呼叫代码中,您有一个来自工厂的软件包,并且:

Package p = myFactory.nextPackage();    // or something
if (p instanceof PrepaidPackage) {
    PrepaidPackage prepaid = (PrefpaidPackage)p;
    // and do the thing you want
} else if (p instanceof PostpaidPackage) {
    PostpaidPackage postpaid = (PostpaidPackage)p;
    // amd do the other things
}

建议您关注的是操作符的实例和类型转换两种可能的设计选择:

  • 让预付费的包裹延期 后付费套餐与您的工厂 然后返回类型为的对象 后付费软件包,该代码 然后打电话给工厂 负责型式检验

  • 有一个包接口 定义所有方法,并具有 PostPad包定义方法 扔 不支持操作异常(ala 集合定义某些 操作(可选)或返回 某种类型的哨兵值(即null)


  • 对于上述任何一种方法,您都可以添加另一个方法getType(),该方法返回要实现的各种包类型的枚举,然后可以在访问factory对象以确定哪些方法可用的代码中使用该方法。

    这将模拟factory类中相同的if-else梯形图。这就像把它们当作对象一样好。我不知道你程序的其余部分,你知道。如果您想使用类之间的相似性,可以在类具有包类型时调用方法。如果你想使用一个类的特殊功能,那么你必须将它转换成那个类型。-是的,为了实现解耦功能,您经常需要重复类似的if-else阶梯。(虽然我猜你的工厂类有更复杂的if-else子句)。如果你的问题有更新或答案有冗长的回答,请将它们附加到原始问题中。