当我要实例化类的时候,不直接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('你好,我叫大白');
就是子类里面实例化的对象,变为了多个,