假设我有一个定义图像对象的类。图像可以属于相册,而相册可以属于文件夹。此数据存储在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('....');

08-28 19:00