O produto tem um TIPO, logo ao meu ver, basta criar uma classe produto com os atributos necessários, como:
List<Image> imagens;
String nomeProduto;
long codigoProduto
Descricao descricao;//a descrição do produto é uma entidade a parte.
float Preco;
Avaliacao avaliacao; //a avaliação também é uma entidade a parte.
TipoProduto tipoProduto;//uma enum, que serve de filtro para pesquisas e padronização e se ficar complexa, você pode tentar usar o padrão Flyweight + Singleton (mais trabalhoso, para algo + complexo), removendo a enum
//outros atributos necessários
Assim, você poderia FILTRAR as pesquisas pelo TIPO do produto e NÃO pela CLASSE.
Neste caso, não vejo como usar herança.
Digo isto pois existe um problema que poucos prestam atenção: <strong>a ambiguidade da linguagem natural</strong>.
Exemplo:
Classe Pessoa;
Classe Cliente herda de Pessoa
Classe Funcionario herda de Cliente
Classe Gerente herda de Funcionário. (Erro semântico)
Estava aceitável até funcionário, só que gerente não é pessoa, é profissão.
Veja, a pessoa pode ser um funcionário e pode ser um gerente (na situação de pessoa).
Mas quando você diz que o gerente é uma pessoa, mas o trata como uma profissão, a herança foi aplicada de forma equivocada, pois o contexto de utilização é diferente.
Assim, a aplicação da herança, usando somente a pergunta é um, sem a análise de um contexto e sem levar em consideração a ambiguidade da linguagem natural é problemática.
Obs.: está é uma opinião pessoal de um estudante, não de alguém que trabalha na área.
Assim, aguarde por outras avaliações.
No geral, eu usaria herança, mas não neste caso.
Té+
Bom trabalho.