Como implementar o padrão DAO em subclasses?

Estou desenvolvendo uma aplicação Java que se trata de uma loja de armas. Possuo a classe Produto com as subclasses Arma, Faca e Munição. Neste projeto estou aplicando o padrão DAO, porém não entendi muito bem como funciona a sua aplicação em subclasses.

DAO da classe Produto:

public class ProdutoDAO implements GenericDAO<Produto> {

    Connection connection = null;

    @Override
    public void save(Produto produto) throws SQLException {
        try {
            connection = new ConnectionFactory().getConnection();
            String sql = "INSERT INTO PRODUTO(ID, ID_MARCA, DESCRICAO,"
                    + "PESO) VALUES (?, ?, ?, ?);"    ;
            PreparedStatement pstm = connection.prepareStatement(sql);
            pstm.setInt(1, produto.getId());
            pstm.setString(2, produto.getDescricao());
            pstm.setDouble(3, produto.getPeso());
            pstm.execute();
        } catch (SQLException sqle) {
            JOptionPane.showMessageDialog(null, "Erro ao inserir o produto no "
                    + "banco de dados." + sqle.getMessage());
            sqle.printStackTrace();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    "Ocorreu um erro. Contate o suporte.\n" + ex.getMessage());
            ex.printStackTrace();
        } finally {
            connection.close();
        }
    }
}

Classe Produto:

public abstract class Produto {
    private int id;
    private String descricao;
    private Marca marca;
    private double peso;

    public Produto(int id, String descricao, Marca marca, double peso) {
        this.id = id;
        this.descricao = descricao;
        this.marca = marca;
        this.peso = peso;
    }

    public int getId() {
        return id;
    }

    public String getDescricao() {
        return descricao;
    }

    public Marca getMarca() {
        return marca;
    }

    public double getPeso() {
        return peso;
    }

    @Override
    public String toString() {
        return id + "|" + descricao + "|" + marca + "|" + peso;
    }

Subclasse Arma:

public class Arma extends Produto {
    private int numeracao;
    private Municao municao;
    private int capacidade;
    private boolean baioneta;

    public Arma(int id, String descricao, Marca marca, double peso) {
        super(id, descricao, marca, peso);
    }  
}

A minha dúvida é em relação à classe ArmaDAO. Como devo implementá-la? Ela deve estender a classe ProdutoDAO? A classe ProdutoDAO deve ser abstrata? Obrigado desde já.

Não tem necessidade de estender, arma, munição e faca tem caracteristicas diferentes

Mas todas elas estendem a classe Produto. E produto tem características presentes nas 3 classes.

Sim, estende produto, e produto pode ser abstrato ja que não terá necessidade de implementar metodos nem declarar variaveis. Segue o diagrama

Essa solução está muito amarrada. As características dos produtos poderiam ficar em uma tabela. Essa herança é gambiarra.

Mas faca possui o material da lamina, tamanho da lamina, tamanho do cabo, tipo de faca.
Propriedades diferentes em relação a arma. Como iria agrupar tudo na mesma classe?

E quando eu preciso utilizar o método getById(int id) da interface, como eu faço? Pq nao consegui descobrir um jeito de fazer isso sem que eu instancie um Produto.

Nao é pra ficar tudo na mesma classe.

Voce pode ter uma classe/tabela para Produtos e uma classe/tabela de Características dos produtos. Ao invés de cada característica ser um atributo amarrado no seu programa, vai ser uma linha na tabela, como se fosse metadados.