`
ponlya
  • 浏览: 158555 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

设计模式-单例-适配-外观

 
阅读更多

无论是工作,还是面试,大家都大谈设计模式,貌似会设计模式就是很厉害的角色了,个人一直认为,设计模式只是一些实践得到的宝贵经验,是解决一些特定场景问题的解决方案。

单例,用的很多。

保证唯一实例,避免重复运算。

从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();
	}
	
}

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics