3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\FactoryMethod\Conceptual; /** * Паттерн Фабричный Метод * * Назначение: Определяет общий интерфейс для создания объектов в суперклассе, * позволяя подклассам изменять тип создаваемых объектов. */ /** * Класс Создатель объявляет фабричный метод, который должен возвращать объект * класса Продукт. Подклассы Создателя обычно предоставляют реализацию этого * метода. */ abstract class Creator { /** * Обратите внимание, что Создатель может также обеспечить реализацию * фабричного метода по умолчанию. */ abstract public function factoryMethod(): Product; /** * Также заметьте, что, несмотря на название, основная обязанность Создателя * не заключается в создании продуктов. Обычно он содержит некоторую базовую * бизнес-логику, которая основана на объектах Продуктов, возвращаемых * фабричным методом. Подклассы могут косвенно изменять эту бизнес-логику, * переопределяя фабричный метод и возвращая из него другой тип продукта. */ public function someOperation(): string { // Вызываем фабричный метод, чтобы получить объект-продукт. $product = $this->factoryMethod(); // Далее, работаем с этим продуктом. $result = "Creator: creator's code has just worked with " . $product->operation(); return $result; } } /** * Конкретные Создатели переопределяют фабричный метод для того, чтобы изменить * тип результирующего продукта. */ class ConcreteCreator1 extends Creator { /** * Обратите внимание, что сигнатура метода по-прежнему использует тип * абстрактного продукта, хотя фактически из метода возвращается конкретный * продукт. Таким образом, Создатель может оставаться независимым от * конкретных классов продуктов. */ public function factoryMethod(): Product { return new ConcreteProduct1(); } } class ConcreteCreator2 extends Creator { public function factoryMethod(): Product { return new ConcreteProduct2(); } } /** * Интерфейс Продукта объявляет операции, которые должны выполнять все * конкретные продукты. */ interface Product { public function operation(): string; } /** * Конкретные Продукты предоставляют различные реализации интерфейса Продукта. */ class ConcreteProduct1 implements Product { public function operation(): string { return "{Result of the ConcreteProduct1}"; } } class ConcreteProduct2 implements Product { public function operation(): string { return "{Result of the ConcreteProduct2}"; } } /** * Клиентский код работает с экземпляром конкретного создателя, хотя и через его * базовый интерфейс. Пока клиент продолжает работать с создателем через базовый * интерфейс, вы можете передать ему любой подкласс создателя. */ function clientCode(Creator $creator) { // ... echo "Client: I'm not aware of the creator's class, but it still works.\n" . $creator->someOperation(); // ... } /** * Приложение выбирает тип создателя в зависимости от конфигурации или среды. */ echo "App: Launched with the ConcreteCreator1.\n"; clientCode(new ConcreteCreator1()); echo "\n\n"; echo "App: Launched with the ConcreteCreator2.\n"; clientCode(new ConcreteCreator2());

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.60.0140.00718.39
8.3.50.0090.00916.71
8.3.40.0100.00718.75
8.3.30.0110.00418.68
8.3.20.0000.00724.18
8.3.10.0040.00424.66
8.3.00.0040.00426.16
8.2.180.0070.00725.92
8.2.170.0140.00319.05
8.2.160.0030.01022.96
8.2.150.0000.00725.66
8.2.140.0000.00824.66
8.2.130.0050.00326.16
8.2.120.0040.00420.93
8.2.110.0070.01119.32
8.2.100.0090.00317.91
8.2.90.0040.00419.27
8.2.80.0000.00817.97
8.2.70.0090.00017.63
8.2.60.0040.00417.93
8.2.50.0040.00418.07
8.2.40.0000.00819.88
8.2.30.0000.00718.11
8.2.20.0000.00717.98
8.2.10.0000.00719.30
8.2.00.0000.00819.28
8.1.280.0120.00325.92
8.1.270.0050.00323.99
8.1.260.0040.00426.35
8.1.250.0030.00528.09
8.1.240.0030.00621.36
8.1.230.0070.00317.64
8.1.220.0030.00517.74
8.1.210.0040.00418.77
8.1.200.0030.00617.23
8.1.190.0030.00617.23
8.1.180.0060.00318.10
8.1.170.0050.00318.46
8.1.160.0040.00418.98
8.1.150.0040.00418.97
8.1.140.0050.00218.85
8.1.130.0030.00320.15
8.1.120.0040.00717.53
8.1.110.0060.00317.46
8.1.100.0000.00717.50
8.1.90.0030.00517.36
8.1.80.0000.00717.35
8.1.70.0000.00817.45
8.1.60.0050.00317.55
8.1.50.0000.00817.62
8.1.40.0000.00817.55
8.1.30.0060.00317.73
8.1.20.0060.00317.69
8.1.10.0040.00417.57
8.1.00.0080.00017.56
8.0.300.0000.00918.77
8.0.290.0040.00416.88
8.0.280.0030.00318.49
8.0.270.0030.00318.16
8.0.260.0030.00318.39
8.0.250.0000.00716.98
8.0.240.0000.00717.06
8.0.230.0070.00016.95
8.0.220.0000.00716.91
8.0.210.0000.00716.89
8.0.200.0000.00617.05
8.0.190.0050.00316.96
8.0.180.0000.00816.98
8.0.170.0000.00916.95
8.0.160.0000.00716.99
8.0.150.0000.00716.99
8.0.140.0000.00716.90
8.0.130.0000.00613.43
8.0.120.0030.00516.97
8.0.110.0000.00716.84
8.0.100.0000.00817.00
8.0.90.0000.00716.78
8.0.80.0100.00516.98
8.0.70.0070.00016.95
8.0.60.0080.00017.00
8.0.50.0000.00816.86
8.0.30.0140.00916.93
8.0.20.0190.01117.00
8.0.10.0140.01417.05
8.0.00.0120.00817.12
7.4.330.0020.00215.55
7.4.320.0060.00016.69
7.4.300.0000.00716.65
7.4.290.0000.00816.58
7.4.280.0040.00416.71
7.4.270.0000.00816.69
7.4.260.0030.00316.43
7.4.250.0000.00816.52
7.4.240.0050.00216.48
7.4.230.0050.00216.60
7.4.220.0020.00516.42
7.4.210.0070.00716.75
7.4.200.0070.00016.39
7.4.160.0150.00516.58
7.4.150.0170.00916.52
7.4.140.0130.01016.40
7.4.130.0140.01216.51
7.4.120.0150.00816.45
7.4.110.0130.01416.38
7.4.100.0120.01116.49
7.4.90.0150.00816.47
7.4.80.0160.00716.46
7.4.70.0140.01016.43
7.4.60.0150.01016.48
7.4.50.0180.00716.38
7.4.40.0150.00816.43
7.4.30.0190.00616.37
7.4.20.0110.01116.52
7.4.10.0170.00716.43
7.4.00.0150.00816.51
7.3.330.0000.00816.17
7.3.320.0060.00013.12
7.3.310.0000.00716.44
7.3.300.0000.00816.34
7.3.290.0070.00716.36
7.3.280.0160.00816.30
7.3.270.0140.00816.29
7.3.260.0190.00316.29
7.3.250.0140.01016.29
7.3.240.0150.00616.33
7.3.230.0140.01016.25
7.3.220.0150.01016.29
7.3.210.0110.01316.23
7.3.200.0150.00916.31
7.3.190.0130.01016.33
7.3.180.0150.00716.29
7.3.170.0130.00816.31
7.3.160.0140.00816.28
7.3.150.0180.00316.35
7.3.140.0190.00716.31
7.3.130.0100.01216.37
7.3.120.0170.00516.23
7.3.110.0130.01016.15
7.3.100.0150.00716.12
7.3.90.0140.00716.54
7.3.80.0130.00716.24
7.3.70.0160.00516.35
7.3.60.0170.00416.46
7.3.50.0150.01116.35
7.3.40.0150.01116.41
7.3.30.0170.00816.39
7.3.20.0200.00616.42
7.3.10.0160.01016.46
7.3.00.0150.01016.47

preferences:
64.04 ms | 401 KiB | 5 Q