Реализация шаблона проектирования заводского метода в единстве

#c# #unity3d #design-patterns #factory

#c# #unity3d #дизайн-шаблоны #завод

Вопрос:

у меня есть следующий код:

Код товара —

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public abstract class Guns : MonoBehaviour //product {  public abstract void shoot();  public GameObject CreateBullet(GameObject bullet)  {  return Instantiate(bullet, transform.position, Quaternion.identity);  }  public void ShootBullet(GameObject bullet, Vector3 direction)  {  bullet.transform.Translate(direction * Time.deltaTime);  }  }  

Код конкретного Продукта 1

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class M16 : Guns //ConcreteProduct {  [SerializeField] GameObject m16bullet;  Vector3 m16bulletdirection = new Vector3(5, 0, 0);   public override void shoot()  {  CreateBullet(m16bullet);  ShootBullet(m16bullet, m16bulletdirection);  }  }  

Код конкретного Изделия 2

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class Uzi : Guns //ConcreteProduct {  [SerializeField] GameObject uzibullet;  Vector3 uzibulletdirection = new Vector3(10, 0, 0);   public override void shoot()  {  CreateBullet(uzibullet);  ShootBullet(uzibullet, uzibulletdirection);  } }  

Код создателя

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public abstract class GunCreator : MonoBehaviour //Creator {  public abstract Guns GunFactory(); }  

Конкретный Код создателя 1

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class M16Creator : GunCreator // ConcreteCreator {   public override Guns GunFactory()  {  return new M16();  } }  

Конкретный Код создателя 2

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class UziCreator : GunCreator // ConcreteCreator {  public override Guns GunFactory()  {  return new Uzi();  } }  

и клиентский код, который в настоящее время ничего не делает, так как я не знаю, как сделать пистолет с помощью этого метода. Итак, как все это поможет мне создать новый сборный пистолет с соответствующим кодом на них?

Кроме того, насколько я понимаю, у каждого нового пистолета должен быть класс NewGunCreator, производный от GunCreator, и класс NewGun, производный от Guns. не проще ли было бы исключить классы создателей?

ваше здоровье!

Комментарии:

1. Имеет ли это какой-то смысл? Вы в основном просто реализовали методы, содержащие одну строку … встроенный для каждого вызова API, доступного для класса … почему бы тогда просто не сделать прямой вызов API?

2. Кроме того , поскольку вы здесь имеете дело с MonoBehaviour этим, это запрещено new M16() . единственные разрешенные способы создания экземпляров MonoBehaviour -это через AddComponent Instantiate или конструктор GameObject

3. Что new Uzi(); на самом деле предполагается делать? Предназначен ли он для создания нового игрового объекта с Uzi прикрепленным к нему сценарием? Предназначено ли это для добавления экземпляра Uzi скрипта к тому же объекту GunCreator , к которому он прикреплен? Желаемый результат неясен. Как derHugo сказано, MonoBehiour s не следует создавать с new помощью экземпляра .

4. @derHugo спасибо за разъяснение 🙂 @Ruzihm new Uzi(); должен создать новый игровой объект с Uzi прикрепленным к нему сценарием

5. GunCreator S понадобилось бы поле, например public M16 prefab; , и тогда вы пошли return Instantiate prefab; бы … все равно: в моих глазах это не имеет никакого смысла … вместо этого вы могли бы напрямую выполнить этот вызов API, не имея для этого фабрики … Фабричный шаблон в основном предназначен для инициализации некоторых внутренних и частных полей и конфигураций, которые должны оставаться скрытыми и неизменяемыми для внешних классов, и запутывать, откуда именно берется этот новый экземпляр и какого именно типа он … На самом деле это не так, как здесь