1
resposta

Olá !! Fiz esse código do padrão Builder. Gostaria de saber se está ok para o padrão ??

  public abstract class Guerreiro
    {

        public string Espada { get; protected    set; }
        public string Armadura { get; protected set; }
        public string Arco { get; protected set; }


        public abstract void EscolherEspada(string espada);
        public abstract void ColocarArmadura(string armadura);
        public abstract void EscolherArco(string arco);

    }

  public abstract class CriadorDeGuerreiro
    {

        protected Guerreiro _guerreiro;

        public Guerreiro ObterGuerreiro()
        {
            return _guerreiro;
        }

        public abstract void ComEspada();
        public abstract void ComArmadura();
        public abstract void ComArco();

    }

   public class CriadorDeGuerreiroFuturista : CriadorDeGuerreiro
    {

        public CriadorDeGuerreiroFuturista()
        {
            _guerreiro = new GuerreiroFuturista();
        }

        public override void ComArco()
        {
            _guerreiro.EscolherArco("Arco futurista");
        }

        public override void ComArmadura()
        {
            _guerreiro.ColocarArmadura("Armadura futurista");
        }

        public override void ComEspada()
        {
            _guerreiro.EscolherEspada("Espada futurista");
        }
    }

  public class CriadorDeGuerreiroMedieval : CriadorDeGuerreiro
    {

        public CriadorDeGuerreiroMedieval()
        {
            _guerreiro = new GuerreiroMedieval();
        }

        public override void ComArco()
        {
            _guerreiro.EscolherArco("Arco medieval");
        }

        public override void ComArmadura()
        {
            _guerreiro.ColocarArmadura("Armadura medieval");
        }

        public override void ComEspada()
        {
            _guerreiro.EscolherEspada("Espada medieval");
        }
    }

  public class GuerreiroFuturista : Guerreiro
    {
        public override void ColocarArmadura(string armadura)
        {
            Armadura = armadura;
        }

        public override void EscolherArco(string arco)
        {
            Arco = arco;
        }

        public override void EscolherEspada(string espada)
        {
            Espada = espada;
        }
    }

  public class GuerreiroMedieval : Guerreiro
    {
        public override void ColocarArmadura(string armadura)
        {
            Armadura = armadura;
        }

        public override void EscolherArco(string arco)
        {
            Arco = arco;
        }

        public override void EscolherEspada(string espada)
        {
            Espada = espada;
        }
    }

  public class Exercito
    {

        public void ConstruirGuerreiro(CriadorDeGuerreiro criador)
        {
            criador.ComArco();
            criador.ComArmadura();
            criador.ComEspada();
        }

    }

  class Program
    {
        static void Main(string[] args)
        {

            var exercito = new Exercito();
            CriadorDeGuerreiro criadorDeGuerreiro;
            Guerreiro guerreiro;

            // criando um guerreiro medieval
            criadorDeGuerreiro = new CriadorDeGuerreiroMedieval();
            exercito.ConstruirGuerreiro(criadorDeGuerreiro);
            guerreiro = criadorDeGuerreiro.ObterGuerreiro();
            Console.WriteLine("Guerreiro com as características: {0}, {1}, {2}",
                    guerreiro.Arco, guerreiro.Armadura, guerreiro.Espada);

            // criando um guerreiro futurista
            criadorDeGuerreiro = new CriadorDeGuerreiroFuturista();
            exercito.ConstruirGuerreiro(criadorDeGuerreiro);
            guerreiro = criadorDeGuerreiro.ObterGuerreiro();
            Console.WriteLine("Guerreiro com as características: {0}, {1}, {2}",
                    guerreiro.Arco, guerreiro.Armadura, guerreiro.Espada);


        }
    }
1 resposta

Olá, Maurício, acho que seu código está ok sim. Você implementou o builder no Criador de Guerreiro como classe abstrata e derivou para os possíveis tipos diferentes (medieval e futurista). No builder, você adicionou os métodos ComArmadura, ComArco, ComEspada, para "montar" o guerreiro. O conceito está certo sim, acho que foi bem aplicado. Apenas como um detalhe menor, acho que a classe Exercito não faz muita coisa no código pra justificar sua existência. Talvez fosse melhor se o Exercito também armazenasse uma coleção de guerreiros que forem sendo criados.