Questions tagged «design-patterns»

设计模式是解决软件设计中常见问题的通用可重用解决方案。当您对设计模式的实现有疑问时,请使用此标签来提问。请不要在有关文本模式匹配的问题上使用此标签。当在实现上遇到重磅问题时使用此标记-标记实现所使用的代码语言。



7
在数据库中实现评论和喜欢
我是软件开发人员。我喜欢编写代码,但我讨厌数据库...目前,我正在创建一个网站,允许用户在该网站上将一个实体标记为喜欢(如FB中),对其进行标记和评论。 我在处理此功能的数据库表设计上陷入了困境。如果我们只能对一种类型的事物(例如照片)执行此操作,那么解决方案将是微不足道的。但是我需要为5种不同的功能启用此功能(现在,但我还假设随着整个服务的增长,这个数字可以增长)。 我在这里找到了一些类似的问题,但是没有一个令人满意的答案,所以我再次问这个问题。 问题是,如何正确,有效和弹性地设计数据库,以便它可以存储不同表的注释,喜欢不同表的注释以及它们的标签。一些设计模式作为答案将是最好的;) 详细描述:我有一个表 User与一些用户数据,以及3个表:Photo用照片,Articles用文章,Places用的地方。我想使任何登录的用户能够: 评论这三个表中的任何一个 将其中任何一个标记为喜欢 用标签标记其中的任何一个 我还想计算每个元素的点赞次数以及使用该特定标签的次数。 1 日的做法: a)对于标签,我将创建一个表 Tag [TagId, tagName, tagCounter],然后我会创造很多一对多的关系表为:Photo_has_tags,Place_has_tag,Article_has_tag。 b)评论数相同。 三)我将创建一个表 LikedPhotos [idUser, idPhoto],LikedArticles[idUser, idArticle],LikedPlace [idUser, idPlace]。数喜欢将计算查询(其中,我认为是坏的)。和... 我真的不喜欢这个设计的最后一部分,对我来说很难闻;) 2 次的方法: 我将创建一个表ElementType [idType, TypeName == some table name],该表将由管理员(me)填充,并带有可被喜欢,注释或标记的表的名称。然后我将创建表: a)LikedElement [idLike, idUser, idElementType, idLikedElement]注释和标签的内容相同,每个注释都有正确的列。现在,当我想制作一张喜欢的照片时,我将插入: typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo' …

13
如何在Kotlin中实现Builder模式?
嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的内容,并开始考虑将我们在应用程序中使用的某些库从Java转换为Kotlin。 这些库充满了带有setter,getter和Builder类的Pojo。现在,我已经在Google上搜寻以找到在Kotlin中实施Builders的最佳方法,但是没有成功。 第二次更新:问题是如何在Kotlin中为带有某些参数的简单pojo编写一个Builder设计模式?下面的代码是我的尝试,方法是编写Java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。 class Car private constructor(builder:Car.Builder) { var model:String? = null var year:Int = 0 init { this.model = builder.model this.year = builder.year } companion object Builder { var model:String? = null private set var year:Int = 0 private set fun model(model:String):Builder { this.model = model return this } …


10
设计模式:抽象工厂与工厂方法
注意:问题在帖子末尾。 我已经阅读了有关Abstract Factory vs Factory Method的其他stackoverflow线程。我了解每种模式的意图。但是,我对该定义不清楚。 Factory Method定义了一个用于创建对象的接口,但是让子类决定要实例化的对象。工厂方法使类将实例化延迟到子类。 相比之下,抽象工厂提供了一个接口,用于创建相关或相关对象的族,而无需指定其具体类。 - 约翰·费米内拉 该抽象工厂看起来非常相似的工厂方法。我画了一些UML类来说明我的观点。 注意: 该图来自www.yuml.com,因此它们的方向不完全正确。但它是免费的服务:)。 这些图可能并不完美。我仍在学习GoF设计模式。 工厂方法: 抽象工厂(仅1个成员): 抽象工厂(更多成员): 问题: 如果抽象工厂只有一个创作者和一个产品,那么它仍然是抽象工厂模式吗?(用于创建家族的界面) 可以从接口创建Factory Method具体创建器,还是必须从类创建它?(类将实例化延迟到子类) 如果抽象工厂只能有一个创建者和一个产品,那么抽象工厂和工厂方法之间的唯一区别是前者的创建者是一个接口,后者的创建者是一个类吗?


6
是否可以在PHP中创建静态类(例如在C#中)?
我想在PHP中创建一个静态类,并使其行为像在C#中一样,所以 构造函数在第一次调用该类时自动被调用 无需实例化 这种东西... static class Hello { private static $greeting = 'Hello'; private __construct() { $greeting .= ' There!'; } public static greet(){ echo $greeting; } } Hello::greet(); // Hello There!

11
是否存在用PHP访问数据库的单例的用例?
我通过PDO访问我的MySQL数据库。我正在设置对数据库的访问权限,而我的第一个尝试是使用以下内容: 我想到的第一件事是global: $db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'root', 'pwd'); function some_function() { global $db; $db->query('...'); } 这被认为是不好的做法。稍作搜索后,我得到了Singleton模式,该模式 “适用于需要一个类的单个实例的情况。” 根据手册中的示例,我们应该这样做: class Database { private static $instance, $db; private function __construct(){} static function singleton() { if(!isset(self::$instance)) self::$instance = new __CLASS__; return self:$instance; } function get() { if(!isset(self::$db)) self::$db = new PDO('mysql:host=127.0.0.1;dbname=toto', 'user', 'pwd') …

11
有效Java中的构建器模式
我最近开始阅读Joshua Bloch撰写的Effective Java。我发现构建器模式[本书中的项目2]的想法非常有趣。我试图在我的项目中实现它,但是有编译错误。本质上,以下是我想做的事情: 具有多个属性的类及其构建器类: public class NutritionalFacts { private int sodium; private int fat; private int carbo; public class Builder { private int sodium; private int fat; private int carbo; public Builder(int s) { this.sodium = s; } public Builder fat(int f) { this.fat = f; return this; } public …

7
ServiceLocator是反模式吗?
最近,我阅读了Mark Seemann的有关Service Locator反模式的文章。 作者指出了ServiceLocator是反模式的两个主要原因: API使用问题(我非常满意) 当类使用Service定位器时,很难看到其依赖关系,因为在大多数情况下,类只有一个PARAMETERLESS构造函数。与ServiceLocator相比,DI方法通过构造函数的参数显式公开依赖项,因此在IntelliSense中很容易看到依赖项。 维护问题(使我感到困惑) 请考虑以下示例 我们有一个使用服务定位器方法的“ MyType”类: public class MyType { public void MyMethod() { var dep1 = Locator.Resolve<IDep1>(); dep1.DoSomething(); } } 现在我们要向类“ MyType”添加另一个依赖项 public class MyType { public void MyMethod() { var dep1 = Locator.Resolve<IDep1>(); dep1.DoSomething(); // new dependency var dep2 = Locator.Resolve<IDep2>(); dep2.DoSomething(); } } …

3
观察者设计模式与“听众”
在我看来,GOF中描述的Observer设计模式与各种工具包中的Listeners确实是同一回事。概念之间是否有区别,或者侦听器和观察者确实是同一回事。 (我并不是在寻找任何特定的计算机语言实现,我只是想从设计的角度理解差异(如果有的话)。是的,我知道SOF中类似问题的答案有几个,但它们都是基于问题的有关特定语言的特定问题-我在寻找设计答案,而不是语言答案。)

10
实体属性值数据库与严格的关系模型电子商务
可以肯定地说,EAV / CR数据库模型是错误的。那就是 问题:应该使用哪种数据库模型,技术或模式来处理描述可以在运行时更改的电子商务产品的属性“类”? 在一个良好的电子商务数据库中,您将存储选项的类别(例如电视分辨率,然后为每个电视都具有一个分辨率,但是下一个产品可能不是电视,并且没有“电视分辨率”)。您如何存储它们,有效搜索以及允许用户使用描述其产品的可变字段来设置产品类型?如果搜索引擎发现客户通常根据控制台深度搜索电视,则可以将控制台深度添加到字段中,然后在运行时为每种电视产品类型添加一个深度。 优秀的电子商务应用程序中有一个很好的通用功能,它们可以显示一组产品,然后具有“向下钻取”侧边菜单,您可以在其中看到“电视分辨率”作为标题,以及最常见的前五种电视分辨率。找到集。您单击一个,它仅显示该分辨率的电视,从而允许您通过在侧面菜单上选择其他类别来进一步向下钻取。这些选项将是在运行时添加的动态产品属性。 进一步讨论: 长话短说,互联网上是否有任何链接或模型描述可以“学术地”修复以下设置? 我感谢诺埃尔·肯尼迪(Noel Kennedy)提出了类别表,但需求可能更大。我在下面以另一种方式描述它,以强调其重要性。我可能需要进行视点校正以解决该问题,或者我可能需要更深入地研究EAV / CR。 喜欢对EAV / CR模型的积极回应。我的所有开发人员都说以下是Jeffrey Kemp谈到的内容:“新实体必须由专业人员建模和设计”(出于上下文考虑,请在下面阅读他的回答)。问题是: 实体每周添加和删除属性 (搜索关键字决定将来的属性) 新实体每周到达 (产品由零件组装) 旧实体每周消失一次 (存档,不受欢迎,季节性) 客户要为产品添加属性有两个原因: 部门/关键字搜索/同类产品之间的比较表 结帐前的消费类产品配置 这些属性必须具有重要性,而不仅仅是关键字搜索。如果他们想比较所有具有“奶油糖霜”的蛋糕,则可以单击蛋糕,单击生日主题,单击“奶油糖霜”,然后检查所有有趣的蛋糕(知道它们都带有奶油糖霜)。这不仅仅针对蛋糕,仅是示例。

4
MVC(Laravel)在哪里添加逻辑
假设每当我执行CRUD操作或以特定方式修改关系时,我也想做其他事情。例如,每当有人发布帖子时,我也希望将某些内容保存到表中进行分析。也许不是最好的例子,但总的来说,这种“分组”功能很多。 通常我会看到这种逻辑被放入控制器。在您要在很多地方重现此功能之前,这一切都很好。当您开始使用局部函数,创建API并生成虚拟内容时,将其保持干燥就成为一个问题。 我所看到的管理事件的方法是事件,存储库,库以及添加到模型中。这是我对每种方法的理解: 服务:大多数人可能会在这里放置此代码。我对服务的主要问题是,有时很难在其中找到特定的功能,而当人们专注于使用Eloquent时,我感到它们被忘记了。我怎么会知道我publishPost()何时需要在库中调用方法$post->is_published = 1? 我认为此方法运行良好的唯一条件是仅使用服务(理想情况下,使控制器能够以某种方式使Eloquent无法访问)。 最终,如果您的请求通常遵循您的模型结构,这似乎只会创建大量多余的文件。 存储库:据我了解,这基本上就像是服务,但是有一个接口,您可以在ORM之间进行切换,而这是我不需要的。 事件:从某种意义上讲,我认为这是最优雅的系统,因为您知道总是在Eloquent方法上调用模型事件,因此您可以像平时那样编写控制器。我可以看到它们变得凌乱,并且如果有人有使用事件进行关键耦合的大型项目的示例,我想看看。 模型:传统上,我会有执行CRUD并处理关键耦合的类。实际上,这使事情变得容易,因为您知道CRUD的所有功能以及其中要做的一切。 很简单,但是在MVC架构中,这通常不是我所看到的。从某种意义上说,尽管与服务相比,我更喜欢此方法,因为它更容易找到,并且可以跟踪的文件更少。它可能会变得有些混乱。我想听听这种方法的缺点,以及为什么大多数人似乎不这样做。 每种方法的优点/缺点是什么?我想念什么吗?

8
代理和装饰器模式之间的差异
您能否给出任何好的解释,Proxy和Decorator有什么区别? 我看到的主要区别是,当我们假设代理使用组合并且装饰器使用聚合时,那么很显然,通过使用多个(一个或多个)装饰器,您可以为预先存在的实例(装饰)修改/添加功能,而代理具有自己的代理类内部实例,并为其添加了一些附加功能(代理行为)的委托。 现在的问题是-不代理创建了聚集仍然是代理还是相当装饰?是否允许(按照GoF模式的定义)创建具有聚合的代理?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.