Tag: design patterns

工厂方法,为什么我们使用静态调用从工厂获取对象

到目前为止我的理解是在使用工厂方法时通过调用工厂的静态方法来获取对象..就像Foo f = Factory.getObj() ..这个方法是静态的,因为我们不需要创建一个在调用getObj方法之前的对象,该方法实际上将返回我想要的具体对象。 但是为什么使用new Factory()然后调用req getObj方法创建Factory类的实例并不常见? 对不起,如果这听起来很愚蠢,但为什么将工厂方法设为静态是很常见的? 静电厂和工厂也是两回事吗?

如何使用枚举中的每种环境类型的值列表来表示键?

我有两个环境PROD和STAGING 。 在prod环境中,我们有三个数据中心ABC , DEF和PQR并且暂存有一个数据中心CORP 。 每个数据中心都有很少的机器,我为它们定义了常量,如下所示: // NOTE: I can have more machines in each dc in future public static final ImmutableList ABC_SERVERS = ImmutableList.of(“tcp://machineA:8081”, “tcp://machineA:8082”); public static final ImmutableList DEF_SERVERS = ImmutableList.of(“tcp://machineB:8081”, “tcp://machineB:8082”); public static final ImmutableList PQR_SERVERS = ImmutableList.of(“tcp://machineC:8081”, “tcp://machineC:8082”); public static final ImmutableList STAGING_SERVERS = ImmutableList.of(“tcp://machineJ:8087″,”tcp://machineJ:8088”); 现在我在同一个类中定义了另一个常量,它按DC分组到每个环境类型的机器列表。 public static final ImmutableMap<Datacenter, […]

这个模式的名称? (答案:使用双重检查锁定进行延迟初始化)

请考虑以下代码: public class Foo { private static object _lock = new object(); public void NameDoesNotMatter() { if( SomeDataDoesNotExist() ) { lock(_lock) { if( SomeDataDoesNotExist() ) { CreateSomeData(); } else { // someone else also noticed the lack of data. We // both contended for the lock. The other guy won // and created the data, […]

为NavigableMap编写同步的线程安全包装器

java.util.Collections目前提供以下实用程序方法,用于为各种集合接口创建synchronized包装器: synchronizedCollection(Collection c) synchronizedList(List list) synchronizedMap(Map m) synchronizedSet(Set s) synchronizedSortedMap(SortedMap m) synchronizedSortedSet(SortedSet s) 类似地,它还有6个unmodifiedXXX重载。 这里明显的遗漏是NavigableMap的实用方法。 它确实extends SortedMap ,但SortedSet extends Set , Set extends Collection ,而Collections则为SortedSet和Set提供了专用的实用方法。 据推测, NavigableMap是一个有用的抽象,或者它首先不存在,但它没有实用的方法。 所以问题是: Collections没有为NavigableMap提供实用程序方法的具体原因是什么? 你会如何为NavigableMap编写自己的synchronized包装器? 浏览OpenJDK版本的Collections.java的源代码似乎表明这只是一个“机械”过程 通常你可以像这样添加synchronized线程安全function吗? 如果是这样一个机械过程,它可以自动化吗? (Eclipse插件等) 这个代码重复是必要的,还是可以通过不同的OOP设计模式来避免?

序列化逻辑应该在实体还是其他类中

应该在何处放置对象序列化逻辑(字段到XML或JSON名称和值的映射)? 在每个实体对象内部或者只是与序列化有关的一组不同的类? 那个与这个问题有关的其他最佳实践? 例如: class Person { String name; } 有些人这样做: class Person { String name; public String toJson () { // build JSON, use ‘name’ field } } 但是,如果我们还需要XML(),toCSV(),toXYZ()保持这个方向将创建可怕的污染代码并打破单一责任原则,即使使用单个toJson方法,恕我直言也已经破坏了。 另一种选择,这就是我通常做的事情: interface Serializer { public String toJson (); } class PersonJsonSerializer implements Serializer { private Person p; public PersonJsonSerializer (Person p) { this.person = p; […]

访客模式解决方案:很少访问者具有相同的界面,但应该使用不同的对象

我有以下类图(访问者模式实现): 预期结果: 1)WiredVisitor应该只访问Router和WiredNetworkCard 2)WirelessVisitor只能访问Router和WirelessNetworkCard 所以,我的问题是:我应该如何改变设计(或代码)以实现我的预期结果? PS我目前的解决方案是在两个访问者中为每次访问(卡:INetworkCard)方法添加以下代码: // in WiredVisitor if (card.getClass.equals(WiredNetworkCard.class)){ // do logic of visit method } // in WirelessVisitor if (card.getClass.equals(WirelessNetworkCard.class)){ // do logic of visit method }

Collections.sort使用什么设计模式?

以下列方式将比较器应用于列表时,使用的设计模式是什么或此处使用的技术是什么? Collections.sort(myCollection, new Comparator() { @Override public int compare(MyItem item1, MyItem item2) { return item1.getId().compareTo(item2.getId()); } });

Java – Memento模式和撤消

我正在实现一个撤消/重做function,这需要我使用纪念模式。 部分程序的流程:“…然后程序使用Memento Pattern存储上一个Vector,然后将新创建的对象添加到Vector中。之后,用户可以选择show命令来显示Vector内部的内容。 ,他也可以输入undo命令恢复,撤消可以重复,直到恢复到原始状态……“ 根据我的研究,我知道会有一个创始人,纪念品和看护人。 这是我的看护人计划 public class CareTaker { private Memento m; private Stack s; private Vector v; // Some of the implementation are not shown public void create() { // Some of the implementation are not shown // Assuming Vector is named “v” // Passing Vector to memento m = new Memento(v); s.add(m); […]

使用枚举的策略模式。 在Java中需要一个简单的例子

我正在尝试理解java中的策略模式和枚举。 我已经搜索了这篇文章并找到了一些关于这个主题的文章,但是大多数文章看起来都太复杂了。 任何人都可以提供一个简单的示例或其他链接,使用java在外行术语中使用枚举来演示策略模式吗? 提前谢谢你。

在使用层次结构参数的操作中避免静态绑定

我发现了一个关于静态绑定的问题。 我真正的课程非常扩展,所以我会用几个玩具类来表达我的问题。 我们假设我们有以下层次结构。 public class Element{} public class Element1 extends Element{} public class Element2 extends Element{} 我有一个Stock类,它使用Element层次结构定义的不同Element化。 public class Stock{ public void operation(Element1 e1){ System.out.println(“Operation – ” + e1.getClass().getName()); } public void operation(Element2 e2){ System.out.println(“Operation – ” + e2.getClass().getName()); } } 最后,我有一个允许管理Stock的StockManager 。 public StockManager{ Stock stock; public StockManager(Stock stock){ this.stock=stock; } public void manage(List […]