Java工厂方法

时间:2017-02-17 10:25:34

标签: java

public interface CPR {
    double balance();
    void debit(double amount);
    void charge(double amount);
}

public class Facile implements CPR {
    private int number;

    Facile(int number){
        this.number = number;
    }

    @Override
    public double balance() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void debit(double amount) {
        // TODO Auto-generated method stub

    }

    @Override
    public void charge(double amount) {
        // TODO Auto-generated method stub

    }

}

public class Gold implements CPR {
    private int number;

    Gold(int number) {
        this.number = number;
    }

    @Override
    public double balance() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void debit(double amount) {
        // TODO Auto-generated method stub

    }

    @Override
    public void charge(double amount) {
        // TODO Auto-generated method stub

    }

}

public class Ecpr implements CPR{
    private int number; 

    Ecpr(int number){
        this.number = number;
    }

    @Override
    public double balance() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void debit(double amount) {
        // TODO Auto-generated method stub

    }

    @Override
    public void charge(double amount) {
        // TODO Auto-generated method stub

    }

}

实现以下客户端。 私人商业和公共。

  • 为客户分配CPR,并'创建并附加到CPR客户端,其类型取决于客户类型: 在现行政策中,私人和'授予一张轻松卡,一个企业,'授予一张金卡 公共行政部门和'分配卡E-CPR。
  • 每种类型的客户都可以拥有其特定的功能:在这三个类的情况下,只有商业客户才有权使用 同时通过实际剩余卡进行支付,支付交易为其他客户提高 如果应付金额超过纸张的可用性,则出现错误(例外)。在所有客户类型中,必须提供以下方法:
    1. getCPR(int number):这个和'调用它的客户的方法,CPR(该类客户的预期类型)的数字和'收到的数字;
    2. chargeCPR(双倍现金):用现金为客户的卡充值;
    3. payCPR(双倍金额)支付客户卡上的总金额,如果付款' 可能的;
    4. cancelCPR(int newnumber):取消当前的CPR,即客户,并在其上调用,用新的CPR替换 CPR(同一类型),编号为newnumber,并且“摆脱了前CPR的遗产;
    5. writeInfo():打印客户的数据,即其税码,类型,并可在客户的卡上找到。

public abstract class Client {
    private CPR card;
    private int CF;

    Client(int CF){
        this.CF = CF;
    }

    abstract CPR makeCPR( int number);

    public void getCPR(int number){
        card = makeCPR(number);
    }

    public void chargeCPR(double amount){
        card.charge(amount);
    }

    public void payCPR(double amount) throws Exception{
    }

    public void cancelCPR(int newnumber){
    }

    public void writeInfo(){        
    }
}

我很难实现扩展客户端的其他类。

例如,我认为私有类会实现它。

    public class Private extends Client {
    private CPR card;

    Private(int CF) {
        super(CF);
        // TODO Auto-generated constructor stub
    }

    @Override
    CPR makeCPR(int number) {
        return new Facile(number);
    }

    public void payCPR(double amount) throws Exception{
        if (amount >  card.balance());
    }

    public void cancelCPR(int newnumber){
    }

    public void writeInfo(){        
    }

}

1 个答案:

答案 0 :(得分:0)

如果我理解你,你需要Client的继承人,这将返回CPR的正确实例。要解决此问题,您可以使用Generics

public abstract class Client<T extends CPR> {
    private CPR card;
    private int CF;

    Client(int CF){
        this.CF = CF;
    }

    abstract T makeCPR( int number);
    //....
}

public class GoldClient extends Client<Gold> {

    Gold makeCPR( int number) {
         return new Gold(number);
    }

}