Java 抽象生成器

Java 抽象生成器,java,design-patterns,abstract,builder,Java,Design Patterns,Abstract,Builder,所以我有一个抽象事务类,它有多个实现(付款、文件) 我希望有一个事务生成器(抽象)+实现者 我这样做: public abstract class TransactionBuilder { protected final Transaction transaction; public TransactionBuilder(Transaction transaction) { this.transaction = transaction;

所以我有一个抽象事务类,它有多个实现(付款、文件)

我希望有一个事务生成器(抽象)+实现者

我这样做:

public abstract class TransactionBuilder
{
    protected final Transaction transaction;
    
    public TransactionBuilder(Transaction transaction)
    {
        this.transaction = transaction;
    }
    
    public TransactionBuilder setSignature(byte[] signature)
    {
        this.transaction.setSignature(signature);
        return this;
    }
    
    public TransactionBuilder setPreviousHash(String previousHash)
    {
        this.transaction.setPreviousHash(previousHash);
        return this;
    }
    
    public abstract Transaction build();
}
PaymentBuilder类的示例:

public class PaymentBuilder extends TransactionBuilder
{
    public PaymentBuilder(String from, String to, double amount)
    {
        super(new Payment(from, to, amount));
    }
    
    public PaymentBuilder addAmount(double amount)
    {
        ((Payment) this.transaction).amount += amount;
    }
    
    @Override
    public Payment build()
    {
        return (Payment) this.transaction;
    }
}
每个字段都有一个getter/setter,事务:

public abstract class Transaction
{
    //Used for serialization
    private String type;
    
    private String previousTransactionHash;
    private String hash;
    private String signature;
    
    private String fromAddress;
    private String toAddress;
    
    private Instant timeStamp;
    
    public Transaction(String type, String from, String to)
    {
        this.type = type;
        this.fromAddress = from;
        this.toAddress = to;
        this.timeStamp = Instant.now();

        setHash();
    }
我如何使用:

Payment payment = new PaymentBuilder(from, to, amount)
                .setPreviousHash(previousHash)
                .build();

但当我调用setSignature()时,我得到“类型不匹配:无法从事务转换为付款”,所以我需要将其转换为付款,我如何避免这种情况?我可以吗?

您可以将抽象生成器设置为泛型,泛型类型是它生成的事务类型

public abstract class TransactionBuilder<T extends Transaction> {
    ...
    public abstract T build();
}

public class PaymentBuilder extends TransactionBuilder<Payment> {
    @Override
    public Payment build() {
        ...
    }
}
公共抽象类TransactionBuilder{
...
公共抽象T build();
}
公共类PaymentBuilder扩展了TransactionBuilder{
@凌驾
公共支付构建(){
...
}
}

多亏了@khelwood,我最终使我的抽象生成器变得通用:

TransactionBuilder:

public abstract class TransactionBuilder<T extends Transaction>
{
    protected final T transaction;
    
    public TransactionBuilder(T transaction)
    {
        this.transaction = transaction;
    }
    
    public TransactionBuilder<T> setSignature(byte[] signature)
    {
        this.transaction.setSignature(signature);
        return this;
    }
    
    public TransactionBuilder<T> setPreviousHash(String previousHash)
    {
        this.transaction.setPreviousHash(previousHash);
        return this;
    }
    
    public abstract T build();
}
公共抽象类TransactionBuilder
{
受保护的最终交易;
公共事务生成器(T事务)
{
this.transaction=交易;
}
公共TransactionBuilder设置签名(字节[]签名)
{
本.交易.设置签名(签名);
归还这个;
}
公共事务生成器setPreviousHash(字符串previousHash)
{
this.transaction.setPreviousHash(previousHash);
归还这个;
}
公共抽象T build();
}
PaymentBuilder:

public class PaymentBuilder extends TransactionBuilder<Payment>
{
    public PaymentBuilder(String from, String to, double amount)
    {
        super(new Payment(from, to, amount));
    }

    public PaymentBuilder addAmount(double amount)
    {
        this.transaction.amount += amount;
    }
    
    @Override
    public Payment build()
    {
        return this.transaction;
    }
}
公共类PaymentBuilder扩展TransactionBuilder
{
public PaymentBuilder(字符串从、字符串到、双倍金额)
{
超级(新付款(从,到,金额));
}
公共付款金额(双倍金额)
{
this.transaction.amount+=金额;
}
@凌驾
公共支付构建()
{
退回此项交易;
}
}

事务的签名是什么?您可以将抽象生成器设置为泛型,泛型类型就是它生成的事务类型。@Sid已更新…太棒了!我怎么没想到:)@khelwood