09-工厂方法
目录
代码示例
将简单工厂修改为工厂方法:
<?php
namespace DesignPattern;
/**
* Description of FunctionFactoryDemo
* 工厂方法
* @author jm
*/
class FunctionFactoryDemo
{
/**
* 入口方法
*/
public static function main(){
$user = UserModuleFactory::createModule();
$user->login();
$pay = PayModuleFactory::createModule();
$pay->order();
$pay->pay();
$share = ShareModuleFactory::createModule();
$share->share();
$ad = AdModuleFactory::createModule();
$ad->ad();
}
}
/**
* Module SDK 模块类 父类
*/
class Module
{
protected $appid = '';
protected $appsecret = '';
public function set($data)
{
$this->appid = $data['appid'];
$this->appsecret = $data['appsecret'];
}
}
/**
* 用户模块
*/
class UserModule extends Module
{
public function login()
{
echo "Login success.".PHP_EOL;
return "";
}
}
/**
* 支付模块
*/
class PayModule extends Module
{
public function order()
{
echo "generate order.".PHP_EOL;
return true;
}
public function pay(){
echo "pay complete.".PHP_EOL;
return true;
}
public function payCallback(){
echo "pay callback success.".PHP_EOL;
return true;
}
}
/**
* 分享模块
*/
class ShareModule extends Module
{
public function share()
{
echo "share code.".PHP_EOL;
return true;
}
}
/**
* 广告
*/
class AdModule extends Module
{
public function ad()
{
echo "get ad info success.".PHP_EOL;
return true;
}
}
/**
* Module ModuleFactory 简单工厂方式
*/
//class ModuleFactory
//{
// public static function createModule($module)
// {
// switch ($module) {
// case 'user':
// $module = new UserModule();
// break;
// case 'pay':
// $module = new PayModule();
// break;
// case 'share':
// $module = new ShareModule();
// break;
// case 'ad':
// $module = new AdModule();
// break;
// }
// return $module;
// }
//}
interface ModuleInterface{
public static function createModule();
}
class UserModuleFactory implements ModuleInterface{
public static function createModule()
{
return new UserModule();
}
}
class PayModuleFactory implements ModuleInterface{
public static function createModule()
{
return new PayModule();
}
}
class ShareModuleFactory implements ModuleInterface{
public static function createModule()
{
return new ShareModule();
}
}
class AdModuleFactory implements ModuleInterface{
public static function createModule()
{
return new AdModule();
}
}
FunctionFactoryDemo::main();
输出:
Login success.
generate order.
pay complete.
share code.
get ad info success.
小结
工厂方法模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
简单工厂在工厂内部判断需要实例化哪个业务类,工厂方法事先定义好业务类,由调用者决定实例化哪个业务类,就调用哪个业务类的对应工厂类;
简单工厂代码量少些,需要常维护工厂类;工厂方法代码量增加,类增多,只要新增业务类及其工厂类,不影响其他业务类及对应工厂类。
本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除
markdown 9ong@TsingChan