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