说明
凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
示例
下面讲解下静态工厂方法模式的代码实现
- 创建公共接口
1
2
3interface Sender{
public function send();
} - 创建实现类
1
2
3
4
5
6
7
8
9
10
11class MailSender implements Sender{
public function send(){
print "mail send";
}
}
class SmsSender implements Sender{
public function send(){
print "sms send";
}
} - 创建工厂类
1
2
3
4
5
6
7
8
9class SendFactory{
public static function produceMail(): Sender{
return new MailSender();
}
public static function produceSms(): Sender{
return new SmsSender();
}
}
我们来测试下:
1
2
3
4
5
6class FactoryTest{
public static function index(){
$sender = SendFactory::produceSms();
$sender->send();
}
}输出结果为:
1
sms send
总结
缺陷:类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。