Является ли этот шаблон псевдо-DI PHP неправильным / опасным? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть, скажем, класс, VehicleManager. Этот класс управляет жизненным циклом и вызовом объектов типа транспортного средства. Транспортные средства действуют как модули и расширяют базовый класс транспортных средств, который является абстрактным.

Итак, если вы делаете классный велосипед, вы никогда не делаете новый Bike (), вы делаете VehicleManager-> create ('Bike', 5);

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

Пример:

final private function __construct(Array $myCustomData){
  $this->customData = $myCustomData;
}

Но все же я хочу, чтобы у каждого типа транспортного средства была некоторая пользовательская инициализация

Итак, после выполнения

$newVehicle = new $ClassName($myCustomData);

Я делаю

$newVehicle->initialize(); 

Это приемлемо? Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать несколько шаблонов для генерации автомобиля в вашем проекте, взгляните на AbstractFactory или FactoryMethod. Их можно использовать в зависимости от контекста вашей программы. Это пример AbstractFactory:

// Vehicle classes
class Vehicle
{
};

class Car extends Vehicle
{
};

class Bike extends Vehicle
{
};

//Abstract factory classes
abstract class VehicleFactory
{
    abstract protected function GetVehicle( $customData );
};

class CarFactory extends VehicleFactory
{
    public function GetVehicle( $customData )
    {
        //Do special init
        return new Car();
    }
};

class BikeFactory extends VehicleFactory
{
    public function GetVehicle( $customData )
    {
        //Do special init
        return new Bike();
    }
};
//Program context classes
class RaceTrack
{
    public function GenerateRacers( VehicleFactory $factory )
    {
        //$factory->GetVehicle(array());
    }
    public function AddRacers( Vehicle $vehicle )
    {
    }
};
$CarFact = new CarFactory();
$RaceTrack = new RaceTrack();
$RaceTrack->GenerateRacers($CarFact);

Это пример метода Фабрики:

//Factory method pattern
class VehicleFactory2
{
    const BIKE_TYPE = 0;
    const CAR_TYPE = 1;

    public function GetVehicle( $type, $customData )
    {
        if ( $type == self::BIKE_TYPE )
        {
            return new Bike($customData);
        }
        else if ( $type == self::CAR_TYPE )
        {
            return new Car($customData);
        }

        return null;
    }
};

$VehicleFact = new VehicleFactory2();
$RaceTrack2 = new RaceTrack();
$RaceTrack2->AddRacers($VehicleFact->GetVehicle(VehicleFactory2::CAR_TYPE, array()));

DI может использоваться как инъекция конструктора, метода, сеттера. Рекомендуется использовать DI, чтобы сделать ваш проект более гибким

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...