Skip to content

Commit 72c89ca

Browse files
committed
feature: adpater added. abstract factory updated. factory method updated. All with php
1 parent e73a98c commit 72c89ca

File tree

83 files changed

+971
-832
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+971
-832
lines changed

.gitignore

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
javascript/*/vendor
2-
typescript/*/vendor
1+
javascript/**/vendor
2+
typescript/**/vendor
3+
typescript/**/node_modules
34

4-
php/*/vendor
5+
php/**/vendor

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/design-patterns.iml

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/php.xml

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
# Design Patterns
2+
This repository is to practice and have a library abotut deign patterns

javascript/Creational/Abstract Factory/example_one.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class HatchbackCarFactory {
130130

131131
/**
132132
* Main function
133-
* @param {CarAbstractFactory} factory Car factory
133+
* @param {CarAbstractFactory} factory EmployeeService factory
134134
*/
135135
function appAbstractFactory(factory) {
136136
console.log('--- [JS] Calling appAbstractFactory ---\n');

javascript/Creational/Factory/factory.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ class BaseCar {
4141
class MastodonCar extends BaseCar {
4242
/** @override showCost() method */
4343
showCost() {
44-
console.log('[MASTODON] Car Cost: 300,000 MXN');
44+
console.log('[MASTODON] EmployeeService Cost: 300,000 MXN');
4545
}
4646
}
4747

4848
class RhinoCar extends BaseCar {
4949
/** @override showCost() method */
5050
showCost() {
51-
console.log('[RHINO] Car Cost: 100,000 MXN');
51+
console.log('[RHINO] EmployeeService Cost: 100,000 MXN');
5252
}
5353
}
5454

@@ -82,7 +82,7 @@ class BaseCar {
8282

8383
/**
8484
* Main function
85-
* @param {CarFactory} factory Car factory
85+
* @param {CarFactory} factory EmployeeService factory
8686
*/
8787
function appFactory(factory) {
8888
console.log('--- [JS] Calling appFactory ---\n');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "alexlatam/abstract-factory",
3+
"autoload": {
4+
"psr-4": {
5+
"AbstractFactory\\": "src/"
6+
}
7+
},
8+
"authors": [
9+
{
10+
"name": "Alexis Montilla",
11+
"email": "[email protected]"
12+
}
13+
],
14+
"require": {}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use AbstractFactory\Contracts\ServicesStackAbstractFactoryInterface;
4+
5+
// Importo el autoload de composer para poder usar las clases de los namespaces.
6+
// Para poder usar todas las clases que se encuentran en la carpeta src
7+
require __DIR__ . '/vendor/autoload.php';
8+
9+
10+
// Creamos una funcion que va a recibir una fabrica como paraametro
11+
// Si nos fijamos bien, en ningun lado indicamos que tipo de fabrica va a recibir,
12+
// Osea que la funcion NO SABE(Y NO TIENE PORQUE SABER) que tipo de vehiculo se esta creando!!!
13+
// EXISTE LA INVERSION DE DEPENDENCIAS!!!
14+
// La funcion no depende de una fabrica especifica, sino que depende de una clase abstracta
15+
// Y esta fabrica abstracta es la que va a crear los vehiculos de cualquier tipo
16+
// El parametro que se espera es de tipo ServicesStackAbstractFactoryInterface, la cual es una clase abstracta,
17+
// pero le enviaremos una clase que herede de esta clase abstracta, en este caso una clase especifica
18+
function randomFunciton(ServicesStackAbstractFactoryInterface $factory)
19+
{
20+
// Creamos un vehiculo desde la fabrica
21+
$vehicle = $factory->createVehicle();
22+
23+
// Del vehiculo llamamos los metodos que tiene
24+
echo $vehicle->getColor() . "\n";
25+
echo $vehicle->getModel() . "\n";
26+
echo $vehicle->getBrand() . "\n";
27+
}
28+
29+
// Ahora llamamos a la funcion y le enviamos una fabrica especifica
30+
// En este caso la fabrica de carros
31+
randomFunciton(new \AbstractFactory\Factories\ServiceStackAbstractFactory());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Patron de Diseño Simple Factory usando autos
2+
3+
La fabrica abstracta(Abstract Factory) parte de la fabrica simple(Simple Factory) y tiene com objetivo abstraer la fabrica.
4+
El objetivo es aplicar el principio de invesion dedependencias.
5+
Que la fabrica no dependa de una implementacion especifica sino mas bien de una implementacion abstracta
6+
7+
8+
### Ejecucion del codigo
9+
En la carpeta del ejemplo ejecutar el siguiente comando
10+
```php
11+
php index.php
12+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace AbstractFactory\Contracts;
4+
5+
// Declaro una interfaz para los empleados. Que seran los productos a crear.
6+
// Esta interfaz sera implementada por todos los empleados que se creen.
7+
// Esta interfaz establecera los metodos que tendran todos los empleados que se crearan
8+
interface EmployeeServiceInterface {
9+
public function getEmployee(): array;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace AbstractFactory\Contracts;
4+
5+
// Declaro una interfaz para los empleados. Que seran los productos a crear.
6+
// Esta interfaz sera implementada por todos los empleados que se creen.
7+
// Esta interfaz establecera los metodos que tendran todos los empleados que se crearan
8+
interface ProductServiceInterface {
9+
public function getProducts(): array;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace AbstractFactory\Contracts;
4+
5+
enum ServiceType
6+
{
7+
case SOAP;
8+
case RESTFUL;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace AbstractFactory\Contracts;
4+
5+
// Esta sera la clase PRINCIPAL del patron de diseño
6+
// Esta clase abstracta define los metodos que van a impklementar las facbricas especificas
7+
// En este caso estamos abstrayendo la fabrica de vehiculos, estamos aplicando la inversion de dependencias
8+
interface ServicesStackAbstractFactoryInterface {
9+
public function getEmployeeService(): EmployeeServiceInterface;
10+
11+
public function getProductService(): ProductServiceInterface;
12+
}

php/Creational/Abstract Factroy/example_one/src/Factories/MotorcycleFactory.php php/Creational/Abstract Factroy/example_four/src/Factories/MotorcycleFactoryInterface.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
namespace AbstractFactory\Factories;
44

5-
use AbstractFactory\VehiclesAbstractFactory;
65
use AbstractFactory\Contracts\VehicleInterface;
6+
use AbstractFactory\Contracts\ServicesStackAbstractFactoryInterface;
77
use AbstractFactory\Vehicles\Motorcycle;
88

9-
class MotorcycleFactory extends VehiclesAbstractFactory
9+
class MotorcycleFactoryInterface extends ServicesStackAbstractFactoryInterface
1010
{
1111
public function createVehicle(): VehicleInterface
1212
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
namespace AbstractFactory\Factories;
3+
4+
5+
use AbstractFactory\Contracts\ServicesStackAbstractFactoryInterface;
6+
use AbstractFactory\Contracts\ServiceType;
7+
8+
class ServiceStackAbstractFactory
9+
{
10+
public function createServiceFactory(ServiceType $type): ?ServicesStackAbstractFactoryInterface
11+
{
12+
return null;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace AbstractFactory\Services\Rest;
4+
5+
use AbstractFactory\Contracts\EmployeeServiceInterface;
6+
use AbstractFactory\Contracts\VehicleInterface;
7+
8+
// La clase EmployeeService al implementar la interfaz VehicleInterface, debe implementar todos los métodos de la interfaz.
9+
class EmployeeService implements EmployeeServiceInterface
10+
{
11+
public function getEmployee(): array
12+
{
13+
return ["Employee 1", "Employee 2", "Employee 3"];
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace AbstractFactory\Services\Rest;
4+
5+
use AbstractFactory\Contracts\EmployeeServiceInterface;
6+
use AbstractFactory\Contracts\ProductServiceInterface;
7+
use AbstractFactory\Contracts\VehicleInterface;
8+
9+
// La clase EmployeeService al implementar la interfaz VehicleInterface, debe implementar todos los métodos de la interfaz.
10+
class ProductService implements ProductServiceInterface
11+
{
12+
public function getProducts(): array
13+
{
14+
return ["Product 1", "Product 2", "Product 3"];
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace AbstractFactory\Services\Soap;
4+
5+
use AbstractFactory\Contracts\EmployeeServiceInterface;
6+
use AbstractFactory\Contracts\VehicleInterface;
7+
8+
// La clase EmployeeService al implementar la interfaz VehicleInterface, debe implementar todos los métodos de la interfaz.
9+
class EmployeeService implements EmployeeServiceInterface
10+
{
11+
public function getEmployee(): array
12+
{
13+
return ["Employee 1", "Employee 2", "Employee 3"];
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace AbstractFactory\Services\Soap;
4+
5+
use AbstractFactory\Contracts\EmployeeServiceInterface;
6+
use AbstractFactory\Contracts\ProductServiceInterface;
7+
use AbstractFactory\Contracts\VehicleInterface;
8+
9+
// La clase EmployeeService al implementar la interfaz VehicleInterface, debe implementar todos los métodos de la interfaz.
10+
class ProductService implements ProductServiceInterface
11+
{
12+
public function getProducts(): array
13+
{
14+
return ["Product 1", "Product 2", "Product 3"];
15+
}
16+
}

php/Creational/Abstract Factroy/example_one/index.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
<?php
1+
<?php
2+
3+
use AbstractFactory\Contracts\ServicesStackAbstractFactoryInterface;
24

3-
use AbstractFactory\VehiclesAbstractFactory;
45
// Importo el autoload de composer para poder usar las clases de los namespaces.
56
// Para poder usar todas las clases que se encuentran en la carpeta src
67
require __DIR__ . '/vendor/autoload.php';
@@ -12,9 +13,9 @@
1213
// EXISTE LA INVERSION DE DEPENDENCIAS!!!
1314
// La funcion no depende de una fabrica especifica, sino que depende de una clase abstracta
1415
// Y esta fabrica abstracta es la que va a crear los vehiculos de cualquier tipo
15-
// El parametro que se espera es de tipo VehiclesAbstractFactory, la cual es una clase abstracta,
16+
// El parametro que se espera es de tipo ServicesStackAbstractFactoryInterface, la cual es una clase abstracta,
1617
// pero le enviaremos una clase que herede de esta clase abstracta, en este caso una clase especifica
17-
function randomFunciton(VehiclesAbstractFactory $factory)
18+
function randomFunciton(ServicesStackAbstractFactoryInterface $factory)
1819
{
1920
// Creamos un vehiculo desde la fabrica
2021
$vehicle = $factory->createVehicle();
@@ -27,4 +28,4 @@ function randomFunciton(VehiclesAbstractFactory $factory)
2728

2829
// Ahora llamamos a la funcion y le enviamos una fabrica especifica
2930
// En este caso la fabrica de carros
30-
randomFunciton(new \AbstractFactory\Factories\CarsFactory());
31+
randomFunciton(new \AbstractFactory\Factories\ServiceStackAbstractFactory());

php/Creational/Abstract Factroy/example_one/src/Contracts/VehicleInterface.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace AbstractFactory\Contracts;
44

5-
// Declaro una interfaz para los vehículos.
5+
// Declaro una interfaz para los vehículos. Que seran los productos a crear.
66
// Esta interfaz sera implementada por todos los vehiculos que se creen.
77
// Esta interfaz es la que se usara en el factory para crear los vehiculos.
8-
// esta interfaz establecera los metodos que tendran todos los vehiculos que se crearan
8+
// Esta interfaz establecera los metodos que tendran todos los vehiculos que se crearan
99
interface VehicleInterface {
1010

1111
public function setColor($rgb): void;

php/Creational/Abstract Factroy/example_one/src/Factories/CarsFactory.php

-14
This file was deleted.

0 commit comments

Comments
 (0)