7

我发现自己在许多新项目中一次又一次地编写相同的编程模式。我一直在考虑创建我自己的此类模式的典型实现的可重用库 - 不是试图涵盖所有可能的设计模式,但只有经验表明将此类典型实现放入库中是有意义的(例如,适配器,工厂等...)-但在我想知道是否没有用于此目的的现有库已可用于Java?

我知道很难以一种可以在具有复杂需求的不同实现中重用它们的方式完全概括编程模式(例如,模式的组合、参与多个模式的类等......)。然而,大多数时候,我需要的模式实例非常简单和标准,并且在许多情况下,使用这样的库可以加快实现工作。

感谢您的反馈意见。!

4

9 回答 9

4

设计模式只是……模式。它们不是可供任何人使用的类,而是在多个项目中发现的通用概念。这就是您找不到设计模式 API 的原因。

于 2011-11-06T22:10:40.930 回答
3

这正是我创建PerfectJPattern的原因。只需确保查看并理解代码示例即可。它们可供下载,也可以在每个 Pattern 实现的站点文档页面中获得。如果您阅读 GoF 书籍,那么您将更容易理解这些示例。

例如,如果您想在您的代码中使用复合模式,并且如果您使用PerfectJPattern,您只需要指定您想用作复合的接口(通用参数和类实例),其余的会提供给您,请参阅完美JPattern 复合。在该页面的底部,提供了一个工作示例,展示了如何完成此操作。

您还应该考虑的另一个方面是,在PerfectJPattern中,您不一定需要重用通用模式实现(例如,perfectjpattern-core Maven 子模块),您也可以选择仅重用纯抽象级别(perfectjpattern-api Maven 子模块)并自己提供实现。在PerfectJPattern中,您可以灵活地在不同抽象级别重用,因为在 Maven 项目结构中也反映了细粒度的分层设计。如果您愿意,重用 perfectjpattern-api 可为您提供抽象模板指南,这将帮助您加快自己的设计模式实现。但是,理想情况下,您应该尽可能多地重用。

更新:跟进下面的评论,值得注意的是,并非所有模式都可以完全胜任,请参阅从模式到组件。一些模式只能部分组件化,而另一些则根本不像 Singleton 的情况。Singleton 过于依赖上下文,这就是为什么您只能在PerfectJPattern中找到接口的原因。然而在PerfectJPattern中,以下模式是完全组件化的,例如 Observer、Command、Adapter、Decorator、Composite、Proxy、Visitor、DAO 等。

于 2012-01-11T09:54:53.797 回答
1

我不同意其他答案,即不能为设计模式创建可重用的实现。但是,它可能并不总是那么简单,并且涉及大量抽象编程。

来自 C#,我错过了 Java 中观察者模式的简单性。(C# 中的事件) 在完成Java的可重用通用观察器后,我遇到了PerfectJPattern库。

可能值得一试。

组件化模式本质上是原始模式的上下文无关可重用类型安全的变体,它至少涵盖与原始模式一样多的用例,并且不需要开发人员在每个模式中重新实现相同的样板代码不同的语境。设计模式在设计方面是可重用的,组件化模式在设计和代码方面是可重用的。

希望减少任何形式的重复的荣誉。“不要重复自己”是编程中最重要的原则之一。


由于一些额外的参数设计模式可以集中在一个库中,我给你一些进一步的例子:

于 2011-11-06T22:37:50.157 回答
1

您正在寻找的是PerfectJPattern

结帐dp4j。它允许您使用 实现单例模式@Singleton并使用@Singleton(lazy=true). 它是“用 Java 实现的可重用组件化设计模式的集合”。

对于 Singleton 推荐dp4j。要实现一个单例,你用注释你的类@Singleton并延迟初始化它你用注释@Singleton(lazy=true)

于 2011-11-11T22:00:10.140 回答
0

如果您发现自己在多个项目中重复了类似的代码,最好将重复的部分提取到可重用代码库中,以避免将来重复自己。

这不太可能导致设计模式的完全通用的可重用实现。

于 2011-11-06T22:33:20.807 回答
0

Java/j2EE 的JT 设计模式框架

于 2011-11-06T23:04:04.637 回答
0

许多模式都内置在 Java SE 中——您可能没有注意到。

装饰器遍布整个java.io包装。

java.sql是 AbstractFactory。

所有的包装类都是享元。

我支持那些说不要寻找模式库的人。它们应该在您编写代码时被发现。

于 2011-11-07T00:45:03.283 回答
0

在提供更高阶功能和其他一些东西的语言中是可能的。这里有一些幻灯片引用了一篇讨论“折纸图案”库的论文。它显示以下模式的“库代码”:Composite、Iterator、Visitor、Builder。因此,如果您想在 jvm 上尝试一下,只需使用 scala。http://www.slideshare.net/remeniuk/algebraic-data-types-and-origami-patterns

于 2011-11-07T12:40:47.830 回答
-1

你看到森林还是树木?

设计模式应该变得明显而不是预先选择。当它们变得明显时,您不需要该模式,因为代码存在。然后您会惊叹于解决方案如何自行解决,您的大脑会下意识地选择正确的方法。它给你那种温暖而模糊的“我相信那个代码”的感觉。

如果你建立一个设计模式库,你就为自己建立了一个大锤子(或锤子工厂,或锤子工厂工厂 [1]),一切都变成了方便的钉子(包括螺丝),导致你的拇指酸痛和意大利面碗开发小组。

[1] http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12

于 2011-11-06T22:47:58.823 回答