设计模式记录

设计模式

抽象工厂模式

PHP工厂模式是一种可扩展、可维护和可重复使用的方法,旨在提供通用接口,用于创建对象。工厂模式的主要组成部分包括抽象工厂、具体工厂、抽象产品和具体产品。通过使用工厂模式,可以提高代码复用率和可扩展性,并且可以减少代码耦合度和客户端代码的负担。然而,工厂模式并非适用于所有情况,在使用工厂模式时需要注意局限性和代码复杂性。

示例:

抽象工厂

php 复制代码
<?php
namespace App\Design\v1\Msg;


/**
 * @Description 生成消息类的工厂
 * @Author guo
 * @Date 2023/10/8 9:38
 **/
interface MsgFactory
{
    public function createMsg(): MsgInterFace;
}

抽象对象

php 复制代码
<?php
namespace App\Design\v1\Msg;

/**
 * @Description 定义消息需实现的接口
 * @Author guo
 * @Date 2023/10/8 9:37
 **/

//定义一个消息发送接口
interface MsgInterFace
{
    public function send($data);
}

具体工厂

php 复制代码
<?php
namespace App\Design\v1\Msg;

/**
 * @Description  实现mqtt推送消息的工厂
 * @Author guo
 * @Date 2023/10/8 10:55
 **/
class MqttFactory implements MsgFactory
{
    public function createMsg(): MsgInterFace
    {
        return new MqttMsg();
    }
}
php 复制代码
<?php
namespace App\Design\v1\Msg;

/**
 * @Description  实现email推送消息的工厂
 * @Author guo
 * @Date 2023/10/8 10:55
 **/
class EmailFactory implements MsgFactory
{
    public function createMsg(): MsgInterFace
    {
        return new EmailMsg();
    }
}

具体对象

php 复制代码
<?php
namespace App\Design\v1\Msg;

use App\Models\Base\v1\Msg\Msg;

/**
 * @Description
 * @Author guo
 * @Date 2023/10/8 10:58
 **/
class MqttMsg implements MsgInterFace
{

    public function send($data)
    {
    	//具体实现
        $msg = new Msg();
        $msg->sendMsg($data);
    }
}
php 复制代码
<?php
namespace App\Design\v1\Msg;

use App\Models\Base\v1\Msg\Msg;

/**
 * @Description
 * @Author guo
 * @Date 2023/10/8 10:58
 **/
class EmailMsg implements MsgInterFace
{

    public function send($data)
    {
        //具体实现
    }
}

单例模式

单例设计模式(Singleton Design Pattern)的意思是:一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。

要实现一个单例,需要关注的点有下面几个:

  • 构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;
  • 考虑对象创建时的线程安全问题;
  • 考虑是否支持延迟加载;
  • 考虑 getInstance() 性能是否高(是否加锁)。

单例模式又分为饿汉式单例模式和懒汉式单例模式:

  • 饿汉式单例模式:在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载实例。采用饿汉式实现方式,将耗时的初始化操作,提前到程序启动的时候完成,这样就能避免在程序运行的时候,再去初始化导致的性能问题。
  • 懒汉式单例模式:相对于饿汉式的优势是支持延迟加载。这种实现方式会导致频繁加锁、释放锁,以及并发度低等问题,频繁的调用会产生性能瓶颈。

实例

php 复制代码
class ObjectA {
    private static $instance = null;
 
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
 
    //私有化构造函数
    private function __construct() {
 
    }
 
    //禁止克隆
    private function __clone() {
 
    }
}
 
$objA1 = ObjectA::getInstance();
$objA2 = ObjectA::getInstance();
var_dump($objA1 === $objA2); //bool(true)
 
$objA3 = clone $objA1; //此处报错:Fatal error: Uncaught Error: Call to private ObjectC::__clone() from context ''
var_dump($objA1 === $objA3); //程序不会执行到这里
相关推荐
是2的10次方啊17 小时前
设计模式与生活①:你的脸,为什么不能有第二个?
设计模式
高晶19 小时前
ARM 嵌入式 Linux 命令系统 BusyBox 实战指南
linux·设计模式·程序员
高晶20 小时前
语音合成与变声技术十大业务场景落地实战:从电商直播到规模化生产
设计模式·程序员
博风1 天前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观1 天前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu2 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL2 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803232 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw3 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ3 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式