Vu que tu n'as pas compris ce que j'ai écris, je vais l'écrire différemment.
Tu as une constante par bloc. À chaque fois que tu demandes air, wall, glass ... c'est cette constante qui est renvoyée. Tu crées donc ton tableau de bloc avec des plusieurs exemplaires des mêmes blocs. Si tu mets un bloc air en 5, 6 et 7, c'est le même qui y est mis, vu que c'est une constante.
Le comportement que tu décris, et qui est problématique pour toi, est le comportement que tu as implémenté. Tu n'as qu'un seul bloc de chaque sorte, grâce au mot-clé "final", qui permet de faire les constantes en Java.
Ne prends pas mal la question : tu as de très grosses lacunes en programmation, non ? Tu sembles connaître des pans entiers, et certaines choses avancées, mais ignorer des bases.
La réponse à ta question, en version courte, est d'écrire quelque chose comme : new GlassBlock();
En version longue :
Il te suffit simplement de supprimer toutes les variables "air", "wall", "glass", etc. et de remplacer les appels à BLock.glass par un "new GlassBlock()", une classe permettant de créer un block de verre.
Si tu veux garder ton idée d'usine et de chaînage d'appels (ce que je trouve personnellement immonde, personnel, je répète ;) ), je te suggère dans ce cas de passer par une classe style http://pastebin.com/TjzUxeuE . Je met en oeuvre le DP Factory dans ce cas.