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