当我要实例化类的时候,不直接new这个类,而是通过调用另一个类的方法来实例化,这就是工厂模式的核心,
就是用很多类,都是一种类型的,然后将这些类汇总在一个新的工厂类里边,工厂方法替你实例化,你想用哪个类,调用工厂类的方法,传入参数,就会返回你需要实例化的类,多了一个封装,类似switch干的活,
修改,增加改动比较少,统一控制,简化逻辑跟代码
工厂分为:简单工厂(静态工厂)、工厂方法模式,抽象工厂模式
简单工厂
其实简单工厂不属于23种设计模式,比较好理解,就是封装汇总
/*** 定义一个接口,规定方法*/interface Message{public function send($msg);}//不同的类实现接口class Ali implements Message{public function send($msg){return '阿里短信->短信内容是:' . $msg;}}class Txun implements Message{public function send($msg){return '腾讯短信->短信内容是:' . $msg;}}class Bdu implements Message{public function send($msg){return '百度短信->短信内容是:' . $msg;}}/*** 工厂类*/class MessageFactory{public static function CreateFactory($type){switch ($type) {case 'ali':return new Ali();break;case 'tengxun':return new Txun();break;case 'baidu':return new Bdu();break;default:return null;break;}}}//使用简单工厂$messages = MessageFactory::CreateFactory('tengxun');echo $messages->send('你好,我叫大白');//输出 腾讯短信->短信内容是:你好,我叫大白
不用一定要使用static静态方法,根据需要来,可以new 然后调用<br />可以不用接口定义,只是为了规范一下,可以各个独立的类,方法一样就行<br />增加类,只需要增加对应的类文件 ,增加工厂类 switch 的type 就行,
工厂方法模式
工厂方法模式对比简单工厂,最核心的一点就是,将实现推迟到了子类中,将简单工厂当作父类,然后子类继承,实现功能,原本的父类的静态方法,变为抽象方法,子类实现这个方法,去掉的switch判断,子类直接返回实例化对象
/*** 定义一个接口,规定方法*/interface Message{public function send($msg);}//不同的类实现接口class Ali implements Message{public function send($msg){return '阿里短信->短信内容是:' . $msg;}}class Txun implements Message{public function send($msg){return '腾讯短信->短信内容是:' . $msg;}}class Bdu implements Message{public function send($msg){return '百度短信->短信内容是:' . $msg;}}/*** 工厂类*/abstract class MessageFactory{//抽象工厂方法abstract protected function CreateFactory();//返回实例化后的类public function Operation(){return $this->CreateFactory();}}//抽象实现子类class MessageAli extends MessageFactory{public function CreateFactory(){return new Ali();}}class MessageTxun extends MessageFactory{public function CreateFactory(){return new Txun();}}class MessageBdu extends MessageFactory{public function CreateFactory(){return new Bdu();}}//使用抽象方法工厂$Factory = new MessageAli();$messages = $Factory->Operation();echo $messages->send('你好,我叫大白');
抽象工厂模式
抽象工厂模式跟工厂方法模式相比,一样都是延迟到子类执行,一样返回指定对象,只是抽象工厂里面返回的不只是一个对象,而是多个
<?php/*** 定义一个接口,规定方法*/interface Message{public function send($msg);}//不同的类实现接口class Ali implements Message{public function send($msg){return '阿里短信->短信内容是:'.$msg;}}class Txun implements Message{public function send($msg){return '腾讯短信->短信内容是:'.$msg;}}class Bdu implements Message{public function send($msg){return '百度短信->短信内容是:'.$msg;}}/*** 定义另外一个接口,规定方法*/interface Message2{public function send($msg);}//不同的类实现接口class Ali2 implements Message2{public function send($msg){return '阿里短信本分->短信内容是:'.$msg;}}class Txun2 implements Message2{public function send($msg){return '腾讯短信本分->短信内容是:'.$msg;}}class Bdu2 implements Message2{public function send($msg){return '百度短信本分->短信内容是:'.$msg;}}/*** 工厂类接口*/interface MessageFactory{//抽象工厂方法public function CreateFactory();//抽象工厂方法public function CreateFactory2();}//抽象实现子类class MessageAli implements MessageFactory{public function CreateFactory(){return new Ali();}public function CreateFactory2(){return new Ali2();}}class MessageTxun implements MessageFactory{public function CreateFactory(){return new Txun();}public function CreateFactory2(){return new Txun2();}}class MessageBdu implements MessageFactory{public function CreateFactory(){return new Bdu();}public function CreateFactory2(){return new Bdu2();}}//使用抽象方法工厂$Factory= new MessageAli();$messages=$Factory->CreateFactory();$messages2=$Factory->CreateFactory2();echo $messages->send('你好,我叫大白');echo $messages2->send('你好,我叫大白');
就是子类里面实例化的对象,变为了多个,
