PHP和golang实现设计模式-工厂方法模式

4 篇文章 0 订阅
4 篇文章 0 订阅

工厂方法模式分为三种:

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没有静态方法,所以就不举例了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值