Skip to content

Instantly share code, notes, and snippets.

@coodix
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coodix/0295375c34b0fdc9025d to your computer and use it in GitHub Desktop.
Save coodix/0295375c34b0fdc9025d to your computer and use it in GitHub Desktop.
<?php
interface Request1 extends BaseRequest
{
function getParam10();
function getParam11();
}
interface Request2 extends BaseRequest
{
function getParam20();
function getParam21();
}
interface SomeFunctionality
{
function doSmth();
}
interface Type extends SomeFunctionality
{
function doSmthElse();
}
class A implements Type
{
public function __construct($param1, $param2) {}
public function doSmth() {}
public function doSmthElse() {}
}
class B implements Type
{
public function __construct($param1, $param2) {}
public function doSmth() {}
public function doSmthElse() {}
}
interface TypeFactory
{
function createTypeFromRequest(Request $Request);
}
class RequestFactoryFactory
{
public function createRequestFactory(BaseRequest $Request)
{
switch (get_class($Request)) {
case 'Request1':
return new Request1RequestFactory;
break;
case 'Request2':
default:
return new Request2RequestFactory;
break;
}
}
}
class Request1RequestFactory
{
public function createRequest(BaseRequest $Request)
{
return new Request($Request->getParam10(), $Request->getParam11());
}
}
class Request2RequestFactory
{
public function createRequest(BaseRequest $Request)
{
return new Request($Request->getParam20(), $Request->getParam21());
}
}
class AFactory implements TypeFactory
{
public function createTypeFromRequest(Request $Request)
{
return new A($Request->getParam1(), $Request->getParam2());
}
}
class BFactory implements TypeFactory
{
public function createTypeFromRequest(Request $Request)
{
return new B($Request->getParam1(), $Request->getParam2());
}
}
// Это же фабрика по факту
class TypeFactoryHelper
{
public function createTypeFactory($type)
{
switch ($type) {
case 'AAA':
return new AFactory;
break;
case 'BBB':
default:
return new BFactory;
break;
}
}
}
(new TypeFactoryHelper)->createTypeFactory($type)->createTypeFromRequest((new RequestFactoryFactory)->createRequestFactory($Request1)->createRequest($Request1))->doSmth();
(new TypeFactoryHelper)->createTypeFactory($type)->createTypeFromRequest((new RequestFactoryFactory)->createRequestFactory($Request2)->createRequest($Request2))->doSmth();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment