php的设计模式:工厂模式

<?php
header("Content-type: text/html; charset=utf-8");
/**
 * 发送接口
 */
interface Sender
{
    public function send();
}

/**
 * 邮箱发送
 */
class MailSender implements Sender
{
    public function send()
    {
        echo '这里是邮箱发送!!!<br />';
    }
}

/**
 * 短信发送
 */
class SmsSender implements Sender
{
    public function send()
    {
        echo '这里是短信发送!!!<br />';
    }
}

/**
 * 简单工厂
 */
class SendFactory
{

    public function produce($type)
    {
        if ("mail" == $type) {
            return new MailSender();
        } else if ("sms" == $type) {
            return new SmsSender();
        } else {
            echo "请输入正确的类型!<br />";
            return null;
        }
    }
}

echo "简单工厂开始:<br/>";
$test = new SendFactory();
$test->produce('mail')->send();
$test->produce('sms')->send();
$test->produce('');

/**
 * 复杂工厂
 */
class SendFactoryMore
{
    public function produceMail()
    {
        return new MailSender();
    }

    public function produceSms()
    {
        return new SmsSender();
    }
}

echo "复杂工厂开始:<br/>";
$test = new SendFactoryMore();
$test->produceMail()->send();
$test->produceSms()->send();

/**
 * 生成工厂接口
 */
interface Provider
{
    /**
     * 注意接口放法是静态,实现才能静态
     */
    public static function produce();
}

/**
 * 短信工厂
 */
class SendSmsFactory implements Provider
{
    public static function produce()
    {
        return new SmsSender();
    }
}

/**
 * 邮箱工厂
 */
class SendMailFactory implements Provider
{
    public static function produce()
    {
        return new MailSender();
    }
}

echo "多工厂开始:<br/>";
SendSmsFactory::produce()->send();
SendMailFactory::produce()->send();

 

总结:工厂模式适合大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。(可以建立静态工厂)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。

所以,从设计角度考虑,就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

posted @ 2017-07-19 16:08  梁大师  阅读(146)  评论(0)    收藏  举报