配置继承模式

本人曾供职于一家国内的还算比较大MIS系统开发商,工作的主要内容是用一套有默认实现的模板式框架去开发一些业务应用系统。在开发的过程中,开发工作的绝大部分内容是配置和写展示用的jsp(没有其他的模板技术)。搞jsp我不在行,于是我就把目标放在了如何减少配置的工作量。这也就是配置继承模式的来源了。到今天算是小有所成,本着请共享和求教的愿望,把我的东西贴出来,希望各位JE大牛帮忙给点意见,本人不甚感激。
话归正题,所谓配置继承呢,准确的应该叫配置信息继承,是指从功能对配置信息的需要出发,按照功能、模块、系统划分建立对应的树形配置域,仿照类继承的方式(系统域是最顶层的父类,功能是最底层的子类)而配置信息获取和管理的模式。在配置继承中,强调功能对配置信息具有控制权:可添加、覆盖、删除配置项;同时配置信息又是可从父域继承而来的:共性信息可以在上级配置以达到共享的目的。除此之外,在其中还加上了以正则表达式为基础的模式的使用,有点像struts1.2以后的通配符的使用。
举例来说,假设在一个比较简单的web系统内有四个功能分别是功能1、功能2、功能3、功能4,其中功能1、功能2是属于模块A的,功能3、功能4是属于模块B的,系统数据源在JNDI中的名字是需要配置的,而且系统在现阶段只是访问一个数据库实例。我们过去的做法是直接建立一个全局共享的配置,里面写明数据源的jndi名。但是世界总是在进步,突然有一天,我们发现一个数据库已经满足不了性能的需要了,需要将一部分功能移植到另外一个新的数据库上面去。首先移的是功能4,数据库的移植和数据的交互先且不说,功能4的程序如何来改呢?我们痛苦的改了一下,凑合着能用了。但是发现移植了功能4的数据访问后还不能满足需要,打算也把功能3移植过去,于是我们又受尽了折磨的把功能3代码改的凑合能用了。但是突然有一天,我们客户对硬件做了个大升级,上了一个无比NIU的数据库,于是我们又需把所有的功能的数据库访问代码改到访问新的数据库上去,这下我们崩溃了,以前不就是白白折腾了嘛。
如果使用配置继承来说,我们首先是在系统域上配置好数据源的名字就可以,通过继承全系统使用这个数据源。到需要移植功能4的时候,我们只需要在功能4的配置信息里覆盖默认继承来的数据源的名字就可以了。移植完了功能3之后呢,我们只需要在模块B那里配置使用新的数据源,把功能4的特殊配置去掉就可以了。如果是完全的移植数据库,那么我们只需要将系统域的配置修改,并且去掉了模块B的特殊配置就可以。可以看到,配置继承是兼顾灵活和共享的一种配置信息的管理模式,特别使用于各个功能的实现的大部分配置信息是相同的情况。当然,要使用配置继承,在功能实现的时候,就需要按照功能去取配置信息的集合,而不是直接引用全局配置信息的集合,这一点和原来的编程方式是有很大的区别。
我做了个配置继承的实现,但是弄了之后个人觉得实现的太糙,而且在实现对spring、struts、hibernate的支持时由于不熟觉得有点摸不着边,因此特别希望有大牛能给一些指导意见,最好是能有感兴趣的朋友跟我一起把他做下去。我把我的实现的代码都已经传到http://code.google.com/p/pyramid/上了,现在主要实现了对XML格式的配置文件的支持,请大家多多指教。
个人MSN:mikabpeng@msn.com,欢迎大家交流。
### JavaFX中单例模式继承的实现方及注意事项 在JavaFX开发中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。然而,单例模式继承之间的结合存在一定的限制和挑战,因为单例模式通常通过私有构造函数和静态方法来控制实例化,这会阻止子类直接继承父类的行为[^1]。 #### 单例模式的基本实现 单例模式的核心思想是通过私有化构造函数防止外部实例化,并通过静态方法或字段提供全局唯一的实例。以下是一个简单的单例模式实现示例: ```java public class Singleton { private static Singleton instance; private Singleton() { // 私有构造函数防止外部实例化 } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` #### 单例模式继承的冲突 由于单例模式中的构造函数被声明为`private`,子类无法调用父类的构造函数进行实例化,因此直接继承单例类会导致编译错误。这种限制使得单例模式继承难以兼容。 #### 解决单例模式继承冲突的方法 为了解决单例模式继承之间的冲突,可以采用以下几种方法: 1. **使用抽象工厂模式** 抽象工厂模式可以通过定义一个接口或抽象类来管理单例实例的创建逻辑,从而允许子类继承并实现自己的单例逻辑。例如: ```java public abstract class SingletonBase { protected abstract SingletonBase getInstance(); public void doSomething() { System.out.println("Base method"); } } public class SingletonChild extends SingletonBase { private static SingletonChild instance; @Override protected SingletonChild getInstance() { if (instance == null) { instance = new SingletonChild(); } return instance; } public void childMethod() { System.out.println("Child method"); } } ``` 2. **延迟初始化(Lazy Initialization)与反射** 在某些情况下,可以通过反射机制动态调用私有构造函数,但这种方法可能破坏单例模式的初衷,应谨慎使用。 3. **枚举单例模式** 枚举类型的单例模式天然支持序列化和反序列化安全,同时避免了反射攻击的问题。虽然枚举本身不支持继承,但可以通过组合的方实现类似的功能。 ```java public enum SingletonEnum { INSTANCE; public void performAction() { System.out.println("Performing action..."); } } ``` 4. **依赖注入框架** 使用依赖注入框架(如Spring)可以更灵活地管理单例对象的生命周期,同时支持继承和多态性。通过配置文件或注解指定单例实例,避免手动实现单例逻辑。 #### 注意事项 - 确保单例实例的线程安全性,特别是在多线程环境中[^2]。 - 避免滥用单例模式,因为它可能导致代码耦合度增加,降低可测试性和可维护性。 - 如果需要继承单例类,优先考虑组合而非继承,以减少设计复杂度。 - 在JavaFX中,单例模式通常用于管理全局资源或配置,例如应用程序的状态管理器或主题样控制器。 ```java public class ApplicationStateManager { private static ApplicationStateManager instance; private ApplicationStateManager() {} public static ApplicationStateManager getInstance() { if (instance == null) { synchronized (ApplicationStateManager.class) { if (instance == null) { instance = new ApplicationStateManager(); } } } return instance; } public void updateState(String newState) { System.out.println("Updating state to: " + newState); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值