Padrão de fábrica. Exemplo de aplicação no Unity

Na verdade, existem muitos métodos de fábrica.
Mesmo as construções básicas se else são métodos de fábrica, assim como o switch.
Mas não é conveniente ler e expandir.


Imagine um exemplo simples. Temos um jogo de terror com monstros. Temos vários modos: fácil, médio, difícil. Portanto, deixe os monstros terem vidas e danos diferentes. Como organizar uma criação conveniente de monstros em um só lugar? Tudo está minado.


1. Crie uma descrição aproximada do monstro na forma de Descrição.


[Serializable] public class MobDescription { public float MaxHealth; public float Damage; } 

2. Encha nossos monstros por níveis


Na verdade, existem muitas maneiras de preencher essas descrições, seja json, xml ou apenas ScriptableObject. Por exemplo, usaremos ScriptableObject e criaremos uma classe de listas de descrições de monstros.


 [CreateAssetMenu(fileName = "MobDescriptions", menuName = "MobDescriptions", order = 51)] public class MobDescriptions : ScriptableObject { [SerializeField] private List<MobDescription> _listOgre; [SerializeField] private List<MobDescription> _listTroll; public List<MobDescription> ListOgre => _listOgre; public List<MobDescription> ListTroll => _listTroll; } 

E pegue isso.


Como fazemos 3 níveis de dificuldade, vamos preencher


Bem, agora temos todas as descrições dos níveis de dificuldade para nossos monstros.


3. Crie um modelo para o monstro mvc.


Este é apenas um modelo para usar a extensão do modelo para não armazenar os dados sobre o monstro diretamente no modelo.


 public class MobModel { private MobDescription _description; private float _currentHealth; public MobDescription Description => _description; public MobModel(MobDescription description){ _description = description; _currentHealth = _description.MaxHealth; } //    } 

4. Agora crie uma classe de fábrica que criará monstros dependendo do nível de dificuldade. É fácil expandir uma fábrica assim, além de adicionar outras fábricas para gerar objetos de descarte ou desova.


 public class Factory { private Dictionary<string, Func<int, MobModel>> mobFactory; public void Init(MobDescriptions descriptions) { mobFactory = new Dictionary<string, Func<int, MobModel>>() { {"ogre", (level) => new MobModel(descriptions.ListOgre[level])}, {"troll", (level) => new MobModel(descriptions.ListTroll[level])} }; } public MobModel CreateMobModel(string nameMob, int level) { return mobFactory[nameMob](level); } } 

5. E, claro, um exemplo de chamar a criação de um monstro.


Embora não haja lógica, usamos o código rígido. Na versão final, isso pode ser uma descrição adicional do nível em que haverá parâmetros para o surgimento de monstros com condições normais. Por exemplo, quando um jogador passa por um ponto específico, N nível X inimigo irá aparecer.


 public class GameManager : MonoBehaviour { [SerializeField] private MobDescriptions _mobDescriptions; private Factory _factory; private void Start() { _factory = new Factory(); _factory.Init(_mobDescriptions); _factory.CreateMobModel("ogre", 2); } } 

Source: https://habr.com/ru/post/pt482402/


All Articles