3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\AbstractFactory\Conceptual; /** * Паттерн Абстрактная Фабрика * * Назначение: Предоставляет интерфейс для создания семейств связанных или * зависимых объектов без привязки к их конкретным классам. */ /** * Интерфейс Абстрактной Фабрики объявляет набор методов, которые возвращают * различные абстрактные продукты. Эти продукты называются семейством и связаны * темой или концепцией высокого уровня. Продукты одного семейства обычно могут * взаимодействовать между собой. Семейство продуктов может иметь несколько * вариаций, но продукты одной вариации несовместимы с продуктами другой. */ interface AbstractFactory { public function createProductA(): AbstractProductA; public function createProductB(): AbstractProductB; } /** * Конкретная Фабрика производит семейство продуктов одной вариации. Фабрика * гарантирует совместимость полученных продуктов. Обратите внимание, что * сигнатуры методов Конкретной Фабрики возвращают абстрактный продукт, в то * время как внутри метода создается экземпляр конкретного продукта. */ class ConcreteFactory1 implements AbstractFactory { public function createProductA(): AbstractProductA { return new ConcreteProductA1(); } public function createProductB(): AbstractProductB { return new ConcreteProductB1(); } } /** * Каждая Конкретная Фабрика имеет соответствующую вариацию продукта. */ class ConcreteFactory2 implements AbstractFactory { public function createProductA(): AbstractProductA { return new ConcreteProductA2(); } public function createProductB(): AbstractProductB { return new ConcreteProductB2(); } } /** * Каждый отдельный продукт семейства продуктов должен иметь базовый интерфейс. * Все вариации продукта должны реализовывать этот интерфейс. */ interface AbstractProductA { public function usefulFunctionA(): string; } /** * Конкретные продукты создаются соответствующими Конкретными Фабриками. */ class ConcreteProductA1 implements AbstractProductA { public function usefulFunctionA(): string { return "The result of the product A1."; } } class ConcreteProductA2 implements AbstractProductA { public function usefulFunctionA(): string { return "The result of the product A2."; } } /** * Базовый интерфейс другого продукта. Все продукты могут взаимодействовать друг * с другом, но правильное взаимодействие возможно только между продуктами одной * и той же конкретной вариации. */ interface AbstractProductB { /** * Продукт B способен работать самостоятельно... */ public function usefulFunctionB(): string; /** * ...а также взаимодействовать с Продуктами A той же вариации. * * Абстрактная Фабрика гарантирует, что все продукты, которые она создает, * имеют одинаковую вариацию и, следовательно, совместимы. */ public function anotherUsefulFunctionB(AbstractProductA $collaborator): string; } /** * Конкретные Продукты создаются соответствующими Конкретными Фабриками. */ class ConcreteProductB1 implements AbstractProductB { public function usefulFunctionB(): string { return "The result of the product B1."; } /** * Продукт B1 может корректно работать только с Продуктом A1. Тем не менее, * он принимает любой экземпляр Абстрактного Продукта А в качестве * аргумента. */ public function anotherUsefulFunctionB(AbstractProductA $collaborator): string { $result = $collaborator->usefulFunctionA(); return "The result of the B1 collaborating with the ({$result})"; } } class ConcreteProductB2 implements AbstractProductB { public function usefulFunctionB(): string { return "The result of the product B2."; } /** * Продукт B2 может корректно работать только с Продуктом A2. Тем не менее, * он принимает любой экземпляр Абстрактного Продукта А в качестве * аргумента. */ public function anotherUsefulFunctionB(AbstractProductA $collaborator): string { $result = $collaborator->usefulFunctionA(); return "The result of the B2 collaborating with the ({$result})"; } } /** * Клиентский код работает с фабриками и продуктами только через абстрактные * типы: Абстрактная Фабрика и Абстрактный Продукт. Это позволяет передавать * любой подкласс фабрики или продукта клиентскому коду, не нарушая его. */ function clientCode(AbstractFactory $factory) { $productA = $factory->createProductA(); $productB = $factory->createProductB(); echo $productB->usefulFunctionB() . "\n"; echo $productB->anotherUsefulFunctionB($productA) . "\n"; } /** * Клиентский код может работать с любым конкретным классом фабрики. */ echo "Client: Testing client code with the first factory type:\n"; clientCode(new ConcreteFactory1()); echo "\n"; echo "Client: Testing the same client code with the second factory type:\n"; clientCode(new ConcreteFactory2());

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.0100.01016.63
8.3.50.0070.00716.50
8.3.40.0090.00918.79
8.3.30.0090.00618.77
8.3.20.0070.00024.18
8.3.10.0050.00324.66
8.3.00.0030.00526.16
8.2.180.0070.00725.92
8.2.170.0080.00619.02
8.2.160.0110.00422.96
8.2.150.0000.00825.66
8.2.140.0080.00024.66
8.2.130.0040.00426.16
8.2.120.0000.00821.20
8.2.110.0070.00422.11
8.2.100.0040.00817.91
8.2.90.0080.00018.09
8.2.80.0050.00318.22
8.2.70.0040.00417.75
8.2.60.0000.00917.63
8.2.50.0030.00617.50
8.2.40.0000.00819.23
8.2.30.0020.00517.98
8.2.20.0000.00817.99
8.2.10.0040.00419.29
8.2.00.0030.00519.28
8.1.280.0120.00625.92
8.1.270.0040.00422.05
8.1.260.0080.00026.35
8.1.250.0040.00428.09
8.1.240.0080.00023.89
8.1.230.0110.00020.97
8.1.220.0040.00417.74
8.1.210.0070.00318.77
8.1.200.0030.00517.23
8.1.190.0100.00017.25
8.1.180.0040.00418.10
8.1.170.0040.00417.62
8.1.160.0040.00418.97
8.1.150.0000.00818.93
8.1.140.0030.00618.95
8.1.130.0000.00717.41
8.1.120.0000.01117.40
8.1.110.0040.00417.38
8.1.100.0000.00817.39
8.1.90.0050.00217.34
8.1.80.0070.00317.42
8.1.70.0030.00517.51
8.1.60.0080.00017.65
8.1.50.0040.00417.61
8.1.40.0050.00317.56
8.1.30.0070.00017.67
8.1.20.0000.00817.69
8.1.10.0050.00217.61
8.1.00.0050.00317.46
8.0.300.0040.00420.09
8.0.290.0050.00316.88
8.0.280.0070.00018.53
8.0.270.0040.00418.08
8.0.260.0000.00716.98
8.0.250.0070.00017.05
8.0.240.0050.00216.89
8.0.230.0060.00317.09
8.0.220.0070.00016.98
8.0.210.0000.00717.06
8.0.200.0030.00317.04
8.0.190.0040.00416.93
8.0.180.0060.00317.07
8.0.170.0000.00816.98
8.0.160.0060.00317.02
8.0.150.0040.00416.95
8.0.140.0000.00716.89
8.0.130.0000.00613.42
8.0.120.0000.00716.88
8.0.110.0030.00516.90
8.0.100.0040.00417.02
8.0.90.0040.00417.01
8.0.80.0090.00516.97
8.0.70.0070.00016.98
8.0.60.0050.00217.00
8.0.50.0040.00417.01
8.0.30.0040.01116.97
8.0.20.0120.00317.11
8.0.10.0130.00317.19
8.0.00.0060.00917.16
7.4.330.0000.00415.55
7.4.320.0040.00416.56
7.4.300.0000.00616.52
7.4.290.0040.00316.53
7.4.280.0050.00316.58
7.4.270.0000.00716.42
7.4.260.0000.00513.25
7.4.250.0060.00316.53
7.4.240.0040.00416.58
7.4.230.0030.00316.55
7.4.220.0020.00516.50
7.4.210.0030.01616.58
7.4.200.0040.00416.67
7.4.160.0070.00716.62
7.4.150.0120.00316.42
7.4.140.0120.00316.51
7.4.130.0080.00616.40
7.4.120.0070.00716.59
7.4.110.0100.01016.65
7.4.100.0100.01016.59
7.4.90.0160.00416.63
7.4.80.0000.01416.63
7.4.70.0090.00616.43
7.4.60.0110.00416.51
7.4.50.0040.01116.42
7.4.40.0060.00916.50
7.4.30.0120.00316.58
7.4.20.0160.00316.52
7.4.10.0040.01116.47
7.4.00.0150.00016.58
7.3.330.0040.00416.50
7.3.320.0060.00013.43
7.3.310.0030.00316.42
7.3.300.0070.00016.38
7.3.290.0060.00916.44
7.3.280.0070.00716.39
7.3.270.0030.01016.51
7.3.260.0030.01516.47
7.3.250.0060.00916.38
7.3.240.0000.01416.38
7.3.230.0130.00616.41
7.3.220.0040.01116.35
7.3.210.0160.00316.30
7.3.200.0100.00316.50
7.3.190.0100.01016.30
7.3.180.0120.00416.32
7.3.170.0090.00616.35
7.3.160.0060.00916.32
7.3.150.0060.01216.33
7.3.140.0040.01116.38
7.3.130.0060.00916.38
7.3.120.0000.01416.40
7.3.110.0030.01616.20
7.3.100.0070.01016.23
7.3.90.0090.00616.55
7.3.80.0070.00716.36
7.3.70.0040.01116.47
7.3.60.0130.00316.44
7.3.50.0040.01116.57
7.3.40.0060.01516.54
7.3.30.0090.00916.53
7.3.20.0090.00616.61
7.3.10.0070.01316.50
7.3.00.0130.00316.49

preferences:
59.99 ms | 400 KiB | 5 Q