php - 减少同一对象的不同类型集合中代码重复的设计模式

标签 php oop design-patterns redis

假设我有一个定义图像对象的类。图片可以属于相册,相册可以属于文件夹。此数据存储在 MySQL 中。数据也被缓存。在缓存中,它以非规范化形式存储,即文件夹跟踪与其关联的图像,相册也是如此。这是出于性能原因而实现的。

现在无论何时创建照片,都会将其添加到缓存中的文件夹和相册中。因为将照片添加到缓存的代码是相同的,只是缓存键发生了变化,所以创建了一个名为 CachedImageSet 的单独对象。文件夹和相册使用其唯一 ID 和集合类型实例化 CachedImageSet,它们调用 CachedImageSet 添加和删除图像并获取集合中的图像列表。

我不希望客户端代码直接与 CachedImageSet 交互,所以我在文件夹和相册类中有一些方法,它们是 CachedImageSet 方法的包装器。这导致大量的代码重复。是否有任何设计模式可以帮助我摆脱这种重复?我正在使用 PHP、MySQL 和 Redis(用于缓存层)。

最佳答案

我可能离题太远了,但如果我正确地解释了你的问题,我会使用工厂模式。

像这样(当然是简化的):

<?php

abstract class Folder {

    public static function factory($driver = 'Database')
    {
        $class = 'Folder_'.str_replace('/', '_', $driver);

        return new $class();
    }

}

class Folder_Database {

    public function get() {
        // Fetch folder from database
    }

    public function save() {
        // Save folder to database
    }

}

class Folder_Cache {

    public function get() {
        // Fetch folder from Redis
    }

    public function save() {
        // Save folder to Redis
    }

}

// Usage:
$folder = Folder::factory('Cache');
$folder->save('....');

关于php - 减少同一对象的不同类型集合中代码重复的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418571/

相关文章:

functional-programming - "Closures are poor man' s 对象,反之亦然”-这是什么意思?

php - 取消链接功能不适用于 Internet Explorer 中的图像

php - 在php数据库连接中使用两个SELECT查询

database - 使用 OOPS 设计数据库表架构?

java - hibernate 和享元

c# - 在运行时将类型传递给 FirstOrDefault

java - 类类型变量或在构造函数/方法中实例化之间有什么区别

PHP SESSIONS 检查用户是否仍在数据库中,同时登录

php - 动态表内连接

ios - 核心数据替代方案