CSharp · Console
using System;
namespace ConsoleApplication1
{
public class Program
{
public static void Main()
{
RocketsAmmo foo = RocketsAmmo.CreateRocketsAmmo(RocketAmmoType.NV);
RocketsAmmo bar = RocketsAmmo.CreateRocketsAmmoNV();
RocketsAmmoLV baz = RocketsAmmo.CreateRocketsAmmoLV();
}
public enum RocketAmmoType
{
NV,
LV
}
public abstract class RocketsAmmo
{
public int CountInBlock { get; }
public int Damage { get; }
public RocketAmmoType RocketAmmoType { get; }
protected RocketsAmmo(RocketAmmoType rocketAmmoType, int damage, int countInBlock)
{
RocketAmmoType = rocketAmmoType;
Damage = damage;
CountInBlock = countInBlock;
}
//Оригинальная концепция шаблона "Фабричный метод" предлагает вынести всё это говно в класс RocketsAmmoFactory,
//но оно будет работать и так
//Один вариант. Получишь нужного потомка в зависимости от параметра
public static RocketsAmmo CreateRocketsAmmo(RocketAmmoType rocketAmmoType)
{
if (rocketAmmoType == RocketAmmoType.NV)
return new RocketsAmmoNV(RocketAmmoType.NV, 20, 1);
if (rocketAmmoType == RocketAmmoType.LV)
return new RocketsAmmoLV(RocketAmmoType.LV, 10, 1);
throw new ArgumentException("Cannot create RocketsAmmo");
}
//Другой вариант, без передачи параметра
public static RocketsAmmo CreateRocketsAmmoNV()
{
return new RocketsAmmoNV(RocketAmmoType.NV, 20, 1);
}
//В этом случае получишь конкретного потомка, а не абстрактный RocketsAmmo
public static RocketsAmmoLV CreateRocketsAmmoLV()
{
return new RocketsAmmoLV(RocketAmmoType.LV, 10, 1);
}
}
public class RocketsAmmoNV : RocketsAmmo
{
public RocketsAmmoNV(RocketAmmoType rocketAmmoType, int damage, int countInBlock) : base(rocketAmmoType, damage, countInBlock)
{
}
}
public class RocketsAmmoLV : RocketsAmmo
{
public RocketsAmmoLV(RocketAmmoType rocketAmmoType, int damage, int countInBlock) : base(rocketAmmoType, damage, countInBlock)
{
}
}
}
}