Last active
August 29, 2015 14:27
-
-
Save coodix/0295375c34b0fdc9025d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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