目录

代码示例

将简单工厂修改为工厂方法:

<?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 @TsingChan