工厂方法模式分为三种:
1. 普通工厂模式
普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
PHP实现
<?php
declare(strict_types = 1);
interface Sender{
public function send(string $msg);
}
class MailSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SmsSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SendFactory{
public function produce(string $type): Sender{
if("mail" === $type){
return new MailSender();
}
else if("sms" === $type){
return new SmsSender();
}
else{
echo "请输入正确的类型\n";
return null;
}
}
}
$factory = new SendFactory();
$mailSender = $factory->produce('mail');
$mailSender->send('This is mailsender!'."\n");
$smsSender = $factory->produce('sms');
$smsSender->send("This is smssender! \n");
golang实现
package main
import (
"fmt"
)
type Sender interface {
send(msg string)
}
type MailSender struct {
}
type SmsSender struct {
}
type SendFactory struct {
}
func (s SendFactory) produce(senderType string) Sender {
if senderType == "mail" {
return MailSender{}
} else if senderType == "sms" {
return SmsSender{}
} else {
return nil
}
}
func (s MailSender) send(msg string) {
fmt.Println(fmt.Sprintf("Mail msg: %s", msg))
}
func (s SmsSender) send(msg string) {
fmt.Println(fmt.Sprintf("Sms msg: %s", msg))
}
func main() {
x := make([]Sender, 2)
factory := SendFactory{}
x[0] = factory.produce("mail")
x[1] = factory.produce("sms")
for _, s := range x {
if x != nil {
s.send("Hello world!")
}
}
}
2. 多个工厂方法模式
多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
PHP 实现:
<?php
declare(strict_types = 1);
interface Sender{
public function send(string $msg);
}
class MailSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SmsSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SendFactory{
public function produceMail(): Sender{
return new MailSender();
}
public function ProduceSms(): Sender{
return new SmsSender();
}
}
$factory = new SendFactory();
$mailSender = $factory->produceMail();
$mailSender->send('This is mailsender!'."\n");
$smsSender = $factory->ProduceSms();
$smsSender->send("This is smssender! \n");
golang 实现:
package main
import (
"fmt"
)
type Sender interface {
send(msg string)
}
type MailSender struct {
}
type SmsSender struct {
}
type SendFactory struct {
}
func (s SendFactory) produceMail() Sender {
return MailSender{}
}
func (s SendFactory) produceSms() Sender {
return SmsSender{}
}
func (s MailSender) send(msg string) {
fmt.Println(fmt.Sprintf("Mail msg: %s", msg))
}
func (s SmsSender) send(msg string) {
fmt.Println(fmt.Sprintf("Sms msg: %s", msg))
}
func main() {
x := make([]Sender, 2)
factory := SendFactory{}
x[0] = factory.produceMail()
x[1] = factory.produceSms()
for _, s := range x {
if x != nil {
s.send("Hello world!")
}
}
}
3. 静态工厂方法模式
静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
PHP实现:
<?php
declare(strict_types = 1);
interface Sender{
public function send(string $msg);
}
class MailSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SmsSender implements Sender{
public function send(string $msg){
echo $msg;
}
}
class SendFactory{
public static function produceMail(): Sender{
return new MailSender();
}
public static function ProduceSms(): Sender{
return new SmsSender();
}
}
$mailSender = SendFactory::produceMail();
$mailSender->send('This is mailsender!'."\n");
$smsSender = SendFactory::ProduceSms();
$smsSender->send("This is smssender! \n");
golang实现:
golang没有静态方法,所以就不举例了