Tag: 设计模式

有关工厂模式的问题

很多人说他们在项目中使用工厂模式。 但是当我真正看到它们的实现时,它看起来与我在第一本书中读到的定义完全不同。 在书中他们描述了两种工厂模式即 工厂方法 : – 类指定其子类,以根据某些参数指定要创建的对象。 所以我们期望这里有一些基类的抽象方法,这些方法将由子类和pupose实现,即创建一些对象 抽象工厂 : – 提供工厂(以接口或抽象工厂的forms),用于创建相关或依赖对象的族,而无需指定其具体类。 我在这里有一个问题,它们是指依赖或相关对象族的含义。 让我们参考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html 。 根据我的理解,这意味着在FinancialToolsFactory (在链接中)能够创建TaxProcessor ,这是一系列产品,其中的实际concreate产品是CanadaTaxProcessor和EuropeTaxProcessor 。 所以在这里我们将有n个具体工厂(在这种情况下是CanadaFinancialToolsFactory和EuropeFinancialToolsFactory ),它们将在这种情况下扩展/实现抽象工厂FinancialToolsFactory 。 如果上述理解是正确的,请告诉我,因为我认为它是工厂模式的关键。 第二个问题: 人们对工厂模式名称的处理如下: public class MyFactory { public static T getObject(Class cls) { if (cls == null) { throw new IllegalArgumentException(“Invalid className”); } T daoObject = (T)map.get(cls); if (daoObject == null) { daoObject […]

我应该尝试在Java中创建可逆枚举还是有更好的方法?

我似乎多次遇到这个问题,我想问一下社区是否只是在咆哮错误的树。 基本上我的问题可以归结为:如果我有一个值很重要的枚举(在Java中),我应该使用枚举还是有更好的方法,如果我使用枚举那么什么是反向查找的最佳方法吗? 这是一个例子。 假设我想创建一个代表特定月份和年份的bean。 我可能会创建如下内容: public interface MonthAndYear { Month getMonth(); void setMonth(Month month); int getYear(); void setYear(int year); } 在这里,我将我的月份存储为一个名为Month的单独类,因此它是类型安全的。 如果我只是输入int,那么任何人都可以传入13或5,643或-100作为数字,并且在编译时无法检查它。 我限制他们把一个月我将实现为枚举: public enum Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER; } 现在假设我有一些我想写的后端数据库,它只接受整数forms。 那么标准的方法似乎是: public enum Month { JANUARY(1), FEBRUARY(2), MARCH(3), APRIL(4), MAY(5), JUNE(6), JULY(7), AUGUST(8), SEPTEMBER(9), […]

我应该validation构造函数中的参数吗?

我正在按照MVC模式创建一个Web应用程序。 在有效的Java中,作者提到在创建新对象时validation类的构造函数中的参数。 但是,我没有创建一些将由第三方使用的API。 我的类只接受表单输入字段中的参数,这些参数在提交到服务器之前已经过validation。 所以在这种情况下,我应该按照作者在Effective java中提到的方式创建我的类,否则它是无用的?

如何在Java中建模一定数量的Money

任何人都可以推荐一个类库或模拟金额的 设计模式吗? 我想它应该支持: 多种货币 一种指示小数位数的机制 数学(尊重某些舍入约定(CFR,即银行家的舍入 )) 序列化与String表示之间的序列化 ……? 即19.99美元可以序列化为“ USD-200000001999 ” (而2表示小数位数)

构建一个对象

我在这个博客中遇到了一种非常不寻常的方法来构建一个类的对象: http : //marchwicki.pl/blog/2010/11/building-a-pojo-in-an-elegant-way/ 。 这是一个很好的方法来做到这一点。 有什么好处?

Java缓存和动态更新

我需要在servlet启动时从数据库“预加载”一些数据。 所以我想创建一些缓存,例如使用HashMap或类似的同步版本。 我还需要更新数据库更新更改的缓存。 所以我想添加一些“听众”。 我的问题是:这是以某种方式提供还是我必须实际实现它? 如果是的话,哪种设计模式最适合这里? 更新: 没有使用JPA或ORM。 但spring可用

使用状态模式设计在Java中实现通信协议

如果在别处得到回答,请道歉; 找不到足够的信息来说服自己最好的方法来做到这一点。 我也意识到这是一个冗长的解释,没有代码,但请告诉我是否应该提供一些示例代码来帮助演示我正在做的事情。 基本上: 使用System.in/out在Java中实现通信协议 当前方法正在实现一种状态模式,其中Scanner在上下文类中的System.in上实例化 具体状态调用上下文方法从扫描程序读取,然后根据扫描程序返回的值适当地执行操作/转换状态 我最初使用状态模式的意图是在从System.in解析这样的序列时简化代码(不要问语法,这是我必须使用的东西): 命令名称= X. HEADER 标题信息行 内容 命令行内容 ENDCONTENTS ENDCOMMAND 我通常为我期望接收的每种命令定义一个具体的状态。 以上面的序列为例,我的状态集看起来像{WAITING_FOR_COMMAND,COM​​MAND_RECEIVED,PARSING_HEADER,PARSING_CONTENTS,PARSING_DONE,COMMAND_PROCESSED}。 我最初在WAITING_FOR_COMMAND,然后当收到“COMMAND NAME = X”时我转换到COMMAND_RECEIVED,然后当“HEADER”进入时我会转换到PARSING_HEADER等等。这个设计使遍历所有边缘情况协议变得更容易,并且在协议被调整时也使代码易于更新/维护。 显然比大规模切换语句和重复边界检查要好得多。 我遇到的问题是,我发现自己在上下文类中声明了越来越多的状态变量,因为我充实了我的具体状态行为,并且知道这可能很糟糕,因为我正在创建非常暴露的接口和非常高的联系上下文和具体的状态类。 该协议中的命令序列可以任意长,并且我需要保存命令序列中每个项所赋予的信息,直到命令序列完成。 以上面的命令序列为例,在“COMMAND ID = X”之后,我希望在收到“ENDCOMMAND”后保存值X以备将来使用并完全处理命令。 在“HEADER”之后,我希望保存标题信息,以便在我实际处理命令时收到“ENDCOMMAND”后将来使用。 等等等等。 简单地将commandId和头状态变量添加到上下文类现在可以工作,但看起来并不干净或完全封装在我身上。 有没有人对他们如何解决这个问题有任何高层建议? 为此更好地使用状态设计模式吗? 只是要注意我一直在玩的一些想法: 为每种类型的命令序列定义状态上下文,并在从System.in接收相关命令时调用适当的上下文; 这看起来几乎像拥有巨大的开关块一样凌乱,似乎过度curl了设计 设计一个支持复合FSM的全面FSM架构,其中每个命令序列在一个总体FSM中占用自己的FSM; 这对我来说似乎有些过分 为每个命令序列类型创建一个具有各种子类的ProtocolCommand对象; 我可以在转换时将它们传递到每个状态,然后逐渐构建它们……但是这会使状态界面变得混乱并强制所有状态摄取它们不一定会使用的参数 非常感谢! 对不起,这太冗长了,如果我能说清楚的话,请告诉我。

MVC很多视图和一个控制器

在我的应用程序中有许多视图(子组件)和只有一个控制器。 在一个视图中选择一些选项可以更改另一个视图中的组件布局和数量。 控制器初始化视图,进而创建所有子组件。 在这样的应用程序中,控制器是否需要引用所有子组件? 如在一个视图中的侦听器中调用控制器来执行操作,然后需要更新另一个视图。 我觉得控制器不应该引用所有的视图,但不知道在哪里形成。 Head第一个设计模式书中的例子只有一个视图,所以我被卡住了。 ++++++++++++++++++++++++ 更多详情。 我正在写的游戏是一个跳棋(草稿)游戏。 在一种情况下,当计算机对抗自身时,用户必须在游戏开始之前选择一些选项。 一个这样的选择是在游戏期间的某些时段选择游戏策略。 例如当它在板上有12到8块时它会攻击更多,在板上8到4块它将更具防御性。 目前游戏GUI的结构方式是,有一个整体的JPanel(RightContainerFrame),其中包含其他JPanel; 然后有一个JPanel(StartGamePanel),用户可以在其中配置游戏。 还有一个包含选项卡的JTabbedPane(jTabbedPane1)。 当用户在JComboBox中选择某个选项时,当前在StartGamePanel中,需要在jTabbedPane1中添加或删除选项卡。 我目前实现这一目标的方法是在StartGamePanel中 RightContainerFrame.getInstance().generateAndDisplayPlayerTwoRangeTabs(numberOfRangeTabsNeeded); 现在我知道这是完全错误的,因为我有一个视图,StartGamePanel通过调用另一个容器视图RightContainerFrame中的方法直接更改另一个视图JTabbedPane。 我对如何构建这个问题的任何建议持开放态度。 首先,我可以将jComboBox1ActionPerformed方法移动到控制器。 这可以更新jTabbedPane1的模型。 或者它可以直接在jTabbedPane1中调用方法来显示所需的选项卡数量。

Java对象,更改字段侦听器,设计模式

有一节课: public class MyClass { private String field1; private String field2; private String field3; // getters, setters } 然后我们更新一些字段 MyClass myClass = new MyClass(); myClass.setField1(“field1”); myClass.setField2(null); 如何知道MyClass的哪些字段被尝试更改(在上面的field1和field2示例中调用)? 什么是最好的解决方案? 也许有些设计模式? 一个选项是为此对象创建已更改字段的HashSet作为附加属性,并在每个setter中更新它,但它看起来不太好。 它应该像Proxy对象那样拦截所有方法调用(即setXXX())(通过Javareflection?)或其他什么? UPDATE 似乎每个setter都应该调用一些内部方法,正如我所说的那样。 我不需要通知任何其他对象有关更改。 我想将所有状态存储在此对象中,以后可以访问这些更改。 详细信息:如果调用方法setFieldX,则应将fieldX标记为稍后更新 PS所有字段都有不同的名称。 除了reflection之外的任何其他解决方案(我想通过纯setter填充对象)?

使用带有“旧”对象引用的Builder模式创建新对象

我正在使用Builder模式并且遇到如何向新创建的对象添加新的“属性”: public class MsProjectTaskData { private boolean isAlreadyTransfered; private String req; public static class Builder { private boolean isAlreadyTransfered = false; public Builder withTransfered(boolean val) { isAlreadyTransfered = val; return this; } public MsProjectTaskData build() { return new MsProjectTaskData(this); } } private MsProjectTaskData(Builder builder) { isAlreadyTransfered = builder.isAlreadyTransfered; } public MsProjectTaskData(String req) { this.req = […]