无论是工作,还是面试,大家都大谈设计模式,貌似会设计模式就是很厉害的角色了,个人一直认为,设计模式只是一些实践得到的宝贵经验,是解决一些特定场景问题的解决方案。
单例,用的很多。
保证唯一实例,避免重复运算。
从HibernateUtil得到SessionFactory,为Dao源源不断生成Session实例,到初始化一些耗时重要的操作,保存结果信息。这里的SessionFactory及结果信息就是要保存的,在系统运行时只允许计算或执行一次的操作,后续都是用这个实例,避免资源浪费。单例有饿汉(直接new 对象了)与懒汉式(需要时再创建)的。
程序上作的手脚有
1.私有化构造方法,不允许通过new的方式创建实例,从而达到控制实例的数量。
2.同步方法或者代码块,以避免代码多次执行;
3.static,使外部程序可通过类名直接访问方法取得这一单例。
《研磨设计模式》中指出了另一种方式,即通过内部类的方式创建:
因:内部类相当于类的成员,用static修饰后会仅且只在第一次时被初始化。这时就保证了唯一的实例,且JVM已经自己可以保证同步,不再需要synchronized控制了。
public class InnerClassSingleton {
/**
* @author zc
* @Time 2011-8-7
*/
private static class SingletonHolder {
private static InnerClassSingleton instance = new InnerClassSingleton();
}
private InnerClassSingleton() {
}
public static InnerClassSingleton getInstance() {
return SingletonHolder.instance;
}
}
适配器
这也是一个常用的模式,Slf4j+slf4j-log4j+log4j,大致它 slf4j-log4j*.jar包中的几个类就是Adapter中的角色。适配器,说白了,就是之前的代码接口等放到现在已经不能符合要求,但是又不想完全抛弃它(毕竟它还是可以完成很多工作的),这时就需要用另一个类来封装它,封装后用新的接口(接口中包含新的方法)统一向外提供服务。slf4j , c3p0 , jboss的日志大致都是这么干的。
适配置器就是封装旧方法,扩展新功能
public class Adapter implements Target { //Target 为新的接口,自定义
private Old old ;//原来的类
public Adapter(Old old){
this.old = old;
}
public void method() {
old.oldMethod();//执行原来类的方法
System.out.println(Adapter.class+" in "+Adapter.class.getResource(""));
}
//………若干新方法
}
外观模式
Facade,英文的音不要读错了.
方便外部系统调用,打包方法(封装内部)。
当一个模块成熟后或者一个向外提供服务的功能完成后,用一个方法作为入口,外部系统或者其它子系统通过这个方法来调用后面N个子方法。这个便是外观模式解决的问题。最多即是用来对外发布接口服务。
public class Facade {
/**
* 提供统一方法
* @throws Exception
*/
public static void test() throws Exception{
FApiA fa = new FAImpl(); //调用第一个操作
fa.generate();
FApiB fb = new FApiBImpl(); //调用 第二个操作
fb.generate();
}
}