Tag: design patterns

双重调度如何在访客模式中工作?

我正在调查与访问者模式相关的其他问题,但无法理解访问者模式中双重调度的实现。 请参阅访问者模式链接 双重调度如何在访客模式中工作?

为什么在服务和dao层中总是有单个实现接口?

我已经/看过一些spring-hibernate Web应用程序项目,它们具有与实际服务和dao类一样多的接口。 我一直认为这两个是这些单一实现接口的主要原因: Spring可以将实际实现连接为给定类中的依赖项(松散耦合) public class Person { @Autowired private Address address; @Autowired private AccountDetail accountDetail; public Person(Address address, AccountDetail accountDetail) { // constructor 在进行unit testing时,我可以创建模拟类并单独测试类。 Address mockedAddress = mock(Address); AccountDetail mockedAccountDetail = mock(AccountDetail); Person underTestPerson = new Person(mockedAddress, mockedAccountDetail); // unit test follows 但是,最近,我意识到: Spring可以将具体实现类连接为依赖项: public class Person { @Autowired private AddressImpl address; @Autowired […]

有效的Java作者:Joshua Bloch:第1项 – 静态工厂方法

我正在阅读Joshua Bloch的Effective Java ,我对Item1 Static Factory Method有疑问。 引用[布洛赫,第7页] 接口不能使用静态方法,因此按照惯例,名为Type的接口的静态工厂方法放在名为Types的不可实例化的类中。 例如,Java Collections Framework提供不可修改的集合,同步集合等。 几乎所有这些实现都是通过一个不可实例化的类(java.util.Collections)中的静态工厂方法导出的。 返回对象的类都是非公共的。 好。 查看源代码时,我看到java.util.Collection接口和带有私有构造函数的java.util.Collections类(不可实例化的类)。 我看到不可实例化的类Collections具有所有静态方法,就像Bloch所说的那样。 但布洛赫说,我没有看到两个class级之间的联系 接口不能使用静态方法,因此按照惯例,名为Type的接口的静态工厂方法放在名为Types的不可实例化的类中。 任何人都可以向我指出明显的事吗? 什么是他说的意思 返回对象的类都是非公共的 这是我获取java源代码的地方: http : //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f

单例模式:使用枚举版本

我不明白如何实现Singleton模式的Enum版本。 下面是使用Singleton模式实现“传统”方法的示例。 我想将其更改为使用Enum版本,但我不确定如何。 public class WirelessSensorFactory implements ISensorFactory{ private static WirelessSensorFactory wirelessSensorFactory; //Private Const private WirelessSensorFactory(){ System.out.println(“WIRELESS SENSOR FACTORY”); } public static WirelessSensorFactory getWirelessFactory(){ if(wirelessSensorFactory==null){ wirelessSensorFactory= new WirelessSensorFactory(); } return wirelessSensorFactory; } }

Hibernate遵循哪种模式?

Martin Fowler在其着作“企业应用程序架构模式”一书中讨论了在软件开发中常见的持久性模式,特别是与ORM相关的持久性模式。 是否存在Hibernate最紧密遵守的模式?

使用JAXB来支持具有微小变化的模式

情况 我需要支持基于模式生成XML文档,这些模式之间只是略有不同。 具体来说,我需要支持的模式基于行业标准,这些标准随着时间的推移会略有变化,供应商可能会制作自己的定制版本。 问题 我打算使用inheritance的JAXB 2(来自Metro)作为解决方案。 我期望包结构最终会像这样: com.company.xml.schema.v1 com.company.xml.schema.v2 com.company.xml.schema.v2.vendorxyz v2包中的类只是扩展v1包中的类并根据需要覆盖。 不幸的是,该计划最终变得不可能,因为子类不能覆盖父类中的注释( 参见此处 )。 例如,如果模式中的属性在版本之间重命名,则v2元素类必须完全重新实现该元素而不从v1inheritance。 据我所知,这让我只有两个选择 选项1 为每个模式类型创建“基础”包,使用@XmlAccessorType(XmlAccessType.NONE)注释该包中的元素类,并删除所有其他注释。 然后,在每个版本化的包中创建类,这些类将“base”包中的相应类子类化,并添加所有必需的注释。 这个解决方案确实给了我一些inheritance领域的帮助,但代码重复是巨大的,维护是一个挑战。 选项2 不要使用JAXB。 我真的不喜欢这个解决方案,因为我也想使用JAX-RS / JAX-WS。 问题 我应该如何使用JAXB来支持具有微小变化的多个模式,而不需要一堆代码重复? 我应该看一下不同的技术组合吗? 编辑 Blaise下面的解决方案非常适用于我们的大部分模式,这些模式只是彼此之间的一个小翻译,通常具有相同的数据。 但是,如果将inheritance与包名称用于版本控制更有意义,我们遇到了一个问题。 例如: com.company.xml.schema.v1.ElementA com.company.xml.schema.v2.ElementA (其中v2.ElementA扩展v1.ElementA) 在这种情况下使用MOXy的OXM会遇到错误,可以在这里找到解决方法(使用Blaise提供的解决方案,不能少!)

在以下示例中使用抽象工厂而不是工厂方法有什么好处?

在写这个问题之前,我读了以下参考文献: 工厂方法与抽象工厂 抽象工厂与工厂方法(范围) 抽象工厂,工厂方法,生成器 工厂,抽象工厂和工厂方法 抽象工厂模式与工厂方法的区别 我看到像我这样的很多人都难以“掌握”抽象工厂和工厂模式之间的具体差异。 我不熟悉设计模式,我遇到了这个例子http://www.oracle.com/technetwork/java/dataaccessobject-138824.html ,我正在努力深化这个主题。 通过比较,我看到3 DTO我们有: 1)抽象工厂 1个抽象类(有3个抽象方法和3个switch-cases); 持久化类型的3个工厂类(每个类有3种获取DTO DAO的方法) 3个接口和9个DAO。 2)工厂方法: 3个工厂类,每个接口一个(每个有3个开关盒); 可能我可以创建3个超类来扩展DAO类而不重复代码,例如连接到数据库的代码; 3个接口和9个DAO。 从代码数量的角度来看,我没有看到任何实质性的差异。 如果您需要添加新的持久性支持或新的接口/ DTO,则差异很小(并且是互补的)。 从客户的角度来看: 1)抽象工厂: public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE; DAOFactory daoFactory = DAOFactory.getDAOFactory(PERSISTENCE_TYPE); CustomerDAO cDAO = daoFactory.getCustomerDAO(); AccountDAO aDAO = daoFactory.getAccountDAO(); OrderDAO oDAO = daoFactory.getOrderDAO(); 2)工厂方法: public static final int PERSISTENCE_TYPE = […]

JDK中的模板设计模式无法找到定义要按顺序执行的方法集的方法

我正在阅读Template design pattern 。 根据我目前的理解,当我们有一个定义了一组过程(方法)的算法时,可以使用模板设计模式。 主要参与者是 1. Abstract Template class提供定义进程(方法)和执行顺序的template method 。 通常这种方法是最终的,因为它的行为不会被修改。 模板方法中提到的几个进程(方法)都提供了默认实现,而其他一些依赖于扩展Abstract模板类类型的具体类则保留为抽象。 2. Concrete classes extending the Template method 。 如有必要,它们会覆盖默认方法,并提供Abstract Template类中定义的抽象方法的实现。 我试着在JDK中搜索它的实现,我看了java.io类后看到这些类实现了这个模式。 我无法找到定义一组进程(方法)和执行顺序的任何方法。 请提供您宝贵的意见。

从Generic Supertype扩展?

在Java中,我能够从通用超类型扩展吗? 根据这篇文章,看起来我应该能够: http : //www.ibm.com/developerworks/java/library/j-djc05133.html 。 public abstract class MyClass extends T { 但是,当我在我的应用程序中执行类似操作时,我收到以下错误: “无法将类型参数T称为超类型。” 有谁知道我是否能够从Java中的通用超类型扩展? 而且,如果是这样,是否需要一些特殊的东西来实现这一目标? 编辑:我读错了文章。 它实际上正在讨论这个潜在的问题。

这是一个众所周知的设计模式吗? 它叫什么名字?

我经常在代码中看到这个,但是当我谈到它时,我不知道这种’模式’的名称 我有一个带有2个参数的方法,它调用一个有3个参数的重载方法,并故意将第3个参数设置为空字符串。 public void DoWork(string name, string phoneNumber) { DoWork(name, phoneNumber, string.Empty) } private void DoWork(string name, string phoneNumber, string emailAddress) { //do the work } 我这样做的原因是不重复代码,并允许现有的调用者仍然调用只有2个参数的方法。 这是一种模式,它有一个名字吗?