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();
总结:工厂模式适合大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。(可以建立静态工厂)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。
所以,从设计角度考虑,就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

浙公网安备 33010602011771号