Tag: 设计模式

Java Singleton vs static – 是否有真正的性能优势?

我正在合并一个CVS分支,其中一个较大的更改是替换它出现的Singleton模式,其抽象类具有静态初始化块和所有静态方法。 这是值得保留的东西,因为它需要合并很多冲突,我会考虑什么样的情况才能使这种重构变得有价值? 我们在Weblogic 8.1下运行这个应用程序(所以JDK 1.4.2) 对不起托马斯,让我澄清一下.. HEAD版本具有传统的单例模式(私有构造函数,getInstance()等) 分支版本没有构造函数,是一个“公共抽象类”,并将对象上的所有方法都修改为“静态”。 以前存在于私有构造函数中的代码将移动到静态块中。 然后更改类的所有用法,这会导致合并中出现多个冲突。 有一些情况发生了这种变化。

清除对建造者模式的疑虑

我正在学习构建器模式,到目前为止我理解,它是用于初始化的常用模式的一个很好的替代方案: 伸缩构造函数模式 JavaBean模式 问题是,我真的不想从我的域模型中的对象中删除getter和setter。 我总是喜欢把它们当作POJO。 我不喜欢它的原因之一是:如果我不使用POJO,那么在使用ORM框架时注释变量并不容易…… 所以这是我的怀疑: – 是否可以在不使用静态内部类的情况下实现构建器模式? – 如果我必须使用内部类使用构建器模式,你认为保持getter和setter是正确的吗? – 我在练习中做了一个小例子,我试图避开内部类。 你能告诉我你怎么看待它? 产品 public class Product { private String color; private int price; public Product() { } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getPrice() { return price; } public void setPrice(int […]

Methods.class中的代码重用与策略模式和dependency injection

Status: Fendy和Glen Best的答案同样被我接受和尊重,但由于我可以接受并给予赏金,我选择了Fendy的答案。 Scenario: 如果我有一些代码 必须在许多类中 重复使用很多次 (很少有明显的次要参数更改)和并发线程,那么采用哪种方法? 必须重用的代码可以是任何理智的东西(适当考虑静态和非静态上下文和方法制作技术)。 它可以是一个算法,一个DB方法做连接,操作,关闭。 任何东西。 创建一些类MyMethods.class 并将所有这些方法放入其中 。 表1.A 使方法 static并直接调用(由所有类和并发线程)作为MyMethods.someMethod(); 1.B. 使方法 non-static并且在调用它们时,通过MyMethods mm = MyMethods(); mm.someMethod(); instantiate整个类 MyMethods mm = MyMethods(); mm.someMethod(); MyMethods mm = MyMethods(); mm.someMethod(); 使用https://en.wikipedia.org/wiki/Strategy_pattern中声明的策略模式 (此处附带的代码)。 使用https://en.wikipedia.org/wiki/Dependency_injection#Java中所述的dependency injection Problems: 有些人会说使用这种方法进行 unit testing http://en.wikipedia.org/wiki/Unit_testing 是不可能的 , 在换出后者时会遇到麻烦 。 如果你想测试你的类并使用依赖的模拟版本 表1.A 并发调用或多个类会有任何问题吗? 特别是在JDBC static methods中只是一个例子? 1.B. […]

生成器模式与inheritance

我想将Web服务URL请求表示为对象,并发现有许多常见参数可以在inheritance层次结构中“冒泡”。 一个请求可能有很多参数,一些是强制的,另一些是可选的,我相信Bloch的Builder模式是一个很好的选择,用一个流畅的接口模拟命名参数。 具体来说,我正在设计Google Maps Web服务API,它具有一般的Web服务请求 http://maps.googleapis.com/maps/api/service/output?{parameters} service和output是必需参数, sensor是必需参数。 还有一个可选的参数language 。 每个服务都有一组强制和可选参数.Geocode服务有两个可选参数, bounds和region 。 它还具有互斥的强制参数, address或location ,用于指定服务类型(分别为直接或反向地理编码)。 我用新的儿童class来代表这种相互排斥。 我想象类层次结构如下: .—–. | Url | ‘—–‘ ^ | .———. | Request | ‘———‘ ^ |—————————-+————–… .———. .————. | Geocode | | Directions | ‘———‘ ‘————‘ ^ ^ |————+ . .——–. .———. . | Direct | | Reverse | […]

为什么在Dao设计模式或其他设计模式中使用接口

请参阅以下Dao设计模式的组件: 数据访问对象模式或DAO模式用于将低级数据访问API或操作与高级业务服务分开。 以下是数据访问对象模式的参与者。 数据访问对象接口 – 此接口定义要对模型对象执行的标准操作。 Data Access Object具体类 – 该类实现上面的接口。 此类负责从数据源获取数据,该数据源可以是database / xml或任何其他存储机制。 模型对象或值对象 – 此对象是包含get / set方法的简单POJO,用于存储使用DAO类检索的数据。 当我们有一个具体的课程时,为什么我们需要一个INTERFACE?为什么我们不能直接使用它? 这可能是一个天真的问题,但请帮助我明确这一点。 不仅在DAO设计模式中,在其他设计模式中,使用INTERFACE也有点令人困惑。 我同意这与代码可重用性和减少耦合有关。 但任何人都可以请进一步解释。

适用于简单聊天应用程序的设计模式

我正在设计一个简单的聊天应用程序(只是为了它的一脚)。 我一直想知道该聊天应用程序的简单设计。 为了给你概述..这里是规则: 匿名用户只需输入昵称即可进入聊天。 (用户ID)可能是由系统在后台分配的。 他们可以加入(订阅)聊天对话。 他会看到其他用户的聊天文本出现在指定区域。 他们可以回复特定的对话,其他人都应该看到。 而已! (见我告诉过你这是一个简单的聊天应用程序)。 所以,我的意图不是真正的应用程序; 但其中使用的设计模式和对象。 现在我就是这样设计的。 (我在java编码..如果真的很重要) 用户对象 – 两个属性id和昵称 消息对象 – 一个简单的Message接口和实现(现在)作为SimpleMessage,其中String作为包含消息的属性。 聊天窗口对象 – 基本上是用户和消息的组合。 因为它有一个用户对象和消息列表。 聊天会话 – 再次组成。 基本上它会有一个Chat Windows列表。 每个聊天窗口都注册到聊天会话。 聊天会话负责在出现新消息时通知所有聊天窗口。 (观察者模式有人吗?) 好吧..所以现在我已经通过使ChatWindow实现“ChatListener”模式实现了观察者模式,该模式具有称为“notify(Message)”的方法。 所以ChatSession会通知每个注册的ChatWindow。 现在这里有一些我想澄清/想要你的意见的事情。 1.我还需要为所有聊天窗口取消注册方法,以防聊天窗口关闭并且不想再收到任何通知。 这可能意味着,要么我应该有一个“静态”中央注册管理器,它只有一个实例,然后任何聊天窗口应该能够通过提供“聊天会话”ID来取消注册自己。 因此,每个聊天会话都应该有一个id。 (包括在内)。 或者我也可以在聊天窗口中维护ChatSession的实例,以便始终准备好实例。 (我讨厌单身人士,因为我认为他们反对哎呀)。 另一种方法是没有取消注册控制聊天窗口,使用聊天窗口,而窗口关闭的通知应直接进入ChatSession,它应该做什么,应该做什么! 这个设计有意义吗? 如果你说这是一个CRAP并给我一个更好的方法; 你一定会非常感谢我。 除了观察者模式之外,这里可以使用所有模式来简化它或使其更好。 此外..这个设计的任何弱点,如果它是合适的,但可以改进。 此外,当用户在他自己的聊天窗口中键入新消息时; 它需要传播到所有聊天窗口,这是聊天会话所做的,但同时; 这是否意味着..聊天会话需要获得带有“聊天窗口ID”和消息的消息? 然后它将它传播到所有窗口,包括作为消息所有者的窗口? 什么是更好的方法来处理这个问题。 我的意思是,窗口让聊天会话知道消息,然后聊天会话到所有其他窗口。 (我觉得它需要一些,如果……也不喜欢它们) 无论如何……请告诉我你的意见。 […]

设计模式在java中使用数百个if else实现业务规则

我必须使用数百行以下代码实现某些业务规则 if this then this else if then this . . // hundreds of lines of rules else that 我们是否有任何设计模式可以有效地实现这一点或重用代码,以便它可以应用于所有不同的规则。 我听说过规范模式,它创建了类似下面的内容 public interface Specification { boolean isSatisfiedBy(Object o); Specification and(Specification specification); Specification or(Specification specification); Specification not(Specification specification); } public abstract class AbstractSpecification implements Specification { public abstract boolean isSatisfiedBy(Object o); public Specification and(final Specification specification) […]

是否可以将inheritance应用于Singleton类?

今天我在采访中遇到了一个问题。 是否可以在Singleton类上应用inheritance概念? 我说因为构造函数是私有的,所以我们不能扩展那个Singleton类。 他问我的下一件事是在Singleton类上应用inheritance。 因此,我将Singleton的构造函数视为受保护的思想,即child的构造函数也受到保护。 但我错了,孩子可以有一个等于或高于此的修饰符。 所以,我让他给出一个关于这种情况的真实世界的例子。 他无法给我一个,并说我无法提问,并希望我告诉他们这种情况是否可能。 我有点空白。 我的问题是, 这可能吗? 即使有可能,它的用途是什么? 现实世界的情景需要这样的用途?

简单的java消息调度系统

我正在开发一个可以发生各种事件的小型Java游戏。 至少有几十个基本事件,各种事件处理程序可能会感兴趣。代码中还有几个地方可能会触发这些事件。 我不想强迫事件监听器知道他们需要注册哪个类,而是想创建某种集中式的消息调度系统,有些类会将事件提交到,感兴趣的类可以挂钩来监听某些类型事件。 但我有一些问题。 首先,这似乎是一个明显而常见的问题。 是否有简单的虚拟机内消息系统的最佳实现? 好像会有。 其次,更重要的是,我正在尝试为调度类找出一种相当优雅的方式来尽可能少地了解消息的类型。 我希望能够在不修改消息调度程序的情况下创建新类型的事件。 但是,我有一个相反的担忧。 我真的很想清楚处理方法的方法签名。 换句话说,我更喜欢以下内容: public class CollisionConsoleHandler implements CollisionListener { @Override public void spaceshipCollidedWithMeteor( Spaceship spaceship, Meteor meteor ) { //… } } 更通用,更难阅读的东西: public class CollisionConsoleHandler implements GameMessageListener { @Override public void handleMessage( GameMessage message ) { if( message instanceof SpaceshipCollisionMessage ) { Spaceship spaceship = […]

Java中的单例和multithreading

在multithreading环境中使用Singleton类的首选方法是什么? 假设我有3个线程,并且所有这些线程都试图同时访问singleton类的getInstance()方法 – 如果不保持同步会发生什么? 使用synchronized getInstance()方法或在getInstance()使用synchronized块是一种好习惯。 请告知是否还有其他方法。