Tag: design patterns

这里有并发问题吗? 如何在开发过程中测试它?

场景:存在’n’个团队,每个团队都在他们的虚拟“墙”上工作(如facebook的墙)。 每个团队只看到自己的墙和上面的post。 这些post可以由post的作者或其他团队成员编辑(如果这样配置的话。假设确实如此,因为它必须具备)。 设计/技术决策:使用Restlet + Glassfish / Java + Mysql的RESTful Web应用程序(编辑:使用Apache DBUtils进行数据库访问。没有ORM – 似乎有点矫枉过正) 问题:多个团队登录T1,T2和T3(比如说),每个团队都有一些成员。 团队级数据访问存在并发性,但团队之间不存在并发性 – 即不同的团队访问不相交的数据集。 为了优化对DB的频繁读/写,我们正在考虑一个TeamGateway,它控制对DB的访问以处理并发。 Web服务器将缓存团队检索的数据以加快读取速度(并帮助更新墙上post列表) Q1:这是否需要(每个团队的TableGateway +缓存)? 如果不是,您如何建议处理? Q2:如果是这样,TableGateway(每个团队)是否需要编码为线程安全(同步方法)? 假设我们有一个类/注册表TableGatewayFinder,它带有一个静态方法,返回TableGateway以用于该特定团队(使用hashmap)。 如果来自每个T1-T3登录的6个人那么只会创建3个TableGateways,它是否有助于捕获并发写入(提交之前的简单时间戳比较或“冲突标记”追加)并有效地管理缓存(我们计划拥有实体的身份映射 – 需要跟踪4-5个不同的实体.4个实体用于组合层次结构,另一个实体与4)中的每一个相关联? 一个单元如何测试网关(基于TDD或事后)? 提前致谢!

Factory方法更适合图书馆的框架和抽象工具吗?

Abstract Factory和Factory方法模式都是创建设计模式,它解决了不同场景下的对象创建问题。 根据GOF 工厂方法模式 定义用于创建对象的接口,但让子类决定实例化哪个类。 Factory方法允许类将实例化延迟到子类。 我的理解: 客户端的动机是获得一个存在于基础工厂类中的方法得到执行,这取决于现在不知道具体类的对象(在这种情况下,无论是在向客户提供软件期间,它都将是定义,或者客户自己编写具体实现,最有可能是框架)。 未知(或可能更改)的产品提供了一种抽象类型:IProduct,并设置一个合同,以后在产品的任何实现中都必须实现此接口。 IProduct接口 package com.companyx; public interface IProduct { public void serve(); } 带有’a method’的工厂类需要执行 package com.companyx; public abstract class Factory { public abstract IProduct createProduct(); private void performCriticalJob(){ IProduct product = createProduct(); product.serve(); } public void executeJob(){ //some code performCriticalJob(); //some more code } } 一些具体的产品 package […]

生命游戏中的蟾蜍模式

我试图为测试解决生命游戏问题。 那场比赛的规则是: 任何活的邻居少于两个的活细胞都会死亡,好像是由于人口不足造成的。 任何有两三个活着的邻居的活细胞都会生活在下一代。 任何有三个以上活着的邻居的活细胞都会死亡,就像过度拥挤一样。 具有正好三个活邻居的任何死细胞变成活细胞,就好像通过繁殖一样。 我测试了我的工作,如下所示的Block,Boat,Blinker和Toad模式等各种模式。 但是我的代码没有给出toad模式的预期输出,如图所示……尽管它对其他所有模式都很好。 我得到TOAD的这个输出: X–X X— –X- 我检查了各种网站,他们也显示了与下面相同的输出,但如果我们应用规则,第二行和最后一列中的单元格不能存活。 那么有人可以告诉我哪个是正确的输出? 我必须确定,因为这是我的测试…… 谢谢.. **Expected Output** 1. Block Pattern Input XX XX Output XX XX 2. Boat Pattern Input XX – X – X – X – Output XX – X – X – X – 3. Blinker Pattern Input – X – […]

带inheritance的工厂方法模式的好方法

假设我有以下类层次结构: class abstract Parent{} class FirstChild extends Parent {} class SecondChild extends Parent {} 我想从每个孩子创建DTO对象: class abstract ParentDTO {} class FirstChildDTO extends ParentDTO{} class SecondChildDTO extends ParentDTO{} 我想我需要一个像这样的工厂方法: ParentDTO createFrom(Parent source); 有没有很好的方法在没有instanceof检查和if / else语句的情况instanceof在Java中执行此操作? 编辑 :此工厂方法不起作用: public ParentDTO create(Parent source) { return _create(source); } private FirstChildDTO _create(FirstChild source) { return new FirstDTO(); } private SecondChildDTO […]

DDD(java)聚合根和持久性

我正在创建一个应用程序,它将使用各种大小的表格,而我已经开发了一个标记为DDD的项目,之后它没有真正使持久性部分正确,因此我还在研究事物。 我没有完全掌握并且似乎无法找到具体例子的一件事是如何坚持聚集根的“孩子”。 我工作时没有ORM(只是普通的老DAO)很难找到的例子(这实际上是针对uni的项目,这是db特定的所以我’不允许’使用ORM,而我很欣赏这简直太容易了。 我已经四处查看了stackoverflow的具体示例,但似乎没有什么能够描述我的特定问题。 我怀疑下面的代码是对的 public DataTable getTableByID(int id) throws AccessException{ DataTable result = this.context.TableContext().getEntityByID(id); result.setColumns(getColumnsByTableID(id)); return result; } private List getColumnsByTableID(int id){ Object[] arguments = { id }; return this.context.ColumnContext().getUnitsWhere(“TABLE_ID = ?”, arguments); } 如您所见,每次检索表实体时都会设置columns集合,如果表已经在内存中,这显然会丢弃已添加到集合中或从集合中删除的任何列。 我不确定我应该在哪里或如何检索列(我已经考虑过从表类中调用存储库但是对此感觉不舒服)。 说到持久性,我也不完全确定如何去做,当我将对象添加到列表中时我可以很容易地检索它们但是当我删除它们时我真的没有办法检测(因为我是确保把事件赶上来这将是作弊:))。 非常感谢,向正确的方向推进一点点,谢谢。

如何在所有子构造函数中自动包含父方法的执行?

我有一个抽象类( Parent ),它有一个抽象方法( doSetup ),以及一个调用doSetup方法的成员方法。 我需要的是构造中的子类(实现Parent )应该自动调用doSetup方法,无论子类可能有多少构造函数。 是否有Java机制或设计模式可以帮助我解决这个问题? public abstract class Parent { abstract protected void sayHi(); protected void doSetup() { sayHi(); } } public class Child1 extends Parent { @Override protected void sayHi() { System.out.println(“hi”); } public Child1() { // Construction needs to automatically include exec of doSetup() } public Child1(String string) { // […]

在Java中实现Memento模式的不同方法

我正在对Memento模式进行一些研究,似乎我遇到的大多数例子看起来都相对相似(将一个字符串保存到数组中并在需要时恢复它)现在纠正我,如果我错了但我相信我刚才描述的方法是“对象克隆”,但是实现Memento模式的其他方法是什么? 从我在序列化上所采用的内容可以使用,但似乎有一个灰色区域,人们说它违反了对象的封装,并且由于这个而不是实现Memento Pattern的一种方式。 那么,是否有人能够阐明实施该模式的方法? 我的研究提出了各种不同的东西混合物,让一切变得混乱。 谢谢

在Spring Singleton中创建新实例会造成内存泄漏吗?

我正在维护一个应用程序,并注意到在Spring连接中定义为Singleton的许多对象在其方法中创建了其他对象的新实例。 例如,每次调用login()方法时都会有一个LoginService Singleton创建一个新的LoginDetails实例。 LoginDetails是瞬态的,只有执行login()方法才需要。 我的问题是,如果Spring为LoginService创建了一个单独的对象,那么如何将LoginDetails实例标记为垃圾收集作为对创建它们的对象的引用并使用它们永远不会终止? 我的意思是: public void deleteCustomer(Long customerId, HttpServletRequest request) { CustomerType customerType = new CustomerType(); customerType.setCustomerId(customerId); CustomerDeleteRequestType deleteRequest = new CustomerDeleteRequestType(); deleteRequest.setCustomer(customerType); CustomerDeleteResponseType deleteResponse = mmmwsClient.executeRequest(deleteRequest); log.debug(“Delete Response Recieved from Server for Customer Name Update ” + deleteResponse.getServiceResult()); } 因为使用的字段只是方法变量而不是实例变量,我想当方法完成时会破坏对它们的引用? 我对Spring Singleton的理解是否正确? 谢谢

如果在代理模式中我们有接口而不是实际具体的代理类中的主题它等同于装饰器模式

代理模式在执行一些额外处理之后将请求委托给Real主题,例如,如果需要处理请求,则应用检查可能是某些凭证检查。 它有如下的类图 Proxy类直接引用具体的Subject。 Decorator Pattern丰富了组件的行为[就像代理它还做了一些额外的处理并将操作委托给真实组件]。 此模式的类图类似于代理模式,唯一的区别是它具有对组件接口的引用。 在Proxy类中具有具体的实际主题使得unit testing变得困难,因为类应该仅依赖于接口而不是实现。 我的问题是,如果代理模式也引用了Real主题公开的接口,那么它将等同于Decorator模式。 在这种情况下,代理模式的类图也将如下所示

一长串if / else / execute代码分支的最佳设计模式/方法

我有一个“遗留”代码,我想重构。 代码基本上是对服务器进行远程调用并获得回复。 然后根据回复执行相应的。 代码骨架示例: public Object processResponse(String responseType, Object response) { if(responseType.equals(CLIENT_REGISTERED)) { //code //code … } else if (responseType.equals(CLIENT_ABORTED)) { //code //code…. } else if (responseType.equals(DATA_SPLIT)) { //code //code… } etc 问题是有很多if / else分支,并且每个内部的代码都不是微不足道的。 因此很难维护。 我想知道这个最好的模式是什么? 我有一个想法是创建一个方法名称与responseType相同的单个对象,然后在processResponse内部使用reflection调用与responseType同名的方法。 这将清理processResponse,但它会将代码移动到具有许多/多种方法的单个对象,我认为reflection会导致性能问题。 是否有一个很好的设计方法/模式来清理它?