设计优化
1.单例模式
(1)对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级的对象而言,是非常可观的一笔系统消耗。
(2)由于new操作的次数减少,因而对系统内存的使用频率降低,这将减轻GC的压力。
2.代理模式
使用代理对象完成用户的请求,屏蔽用户对真实对象的访问,这里主要讨论使用代理模式实现延迟加载,从而提升系统的性能和反映速度。例如,使用代理类封装对数据库查询中的初始化操作,当系统启动时,初始化这个代理类,而非只是的数据库查询类,而代理类什么都没有做。
延迟加载的核心思想是:如果当前并没有使用这个组件,则不需要真正地初始化它,使用一个代理的对象替代它原有的位置,只要在真正需要使用的时候,才对它进行加载。
- 动态代理
动态代理是指在运行时,动态的生成代理类,即,代理类的字节码将在运行时生成并载入当前的ClassLoader。
public interface Subject {
public void doSomething();
}
public class RealSubject implements Subject {
public void doSomething() {
System.out.println("call doSomething()");
}
}
public class ProxyHandler implements InvocationHandler {
private Object proxied;
public ProxyHandler(Object proxied) {
this.proxied = proxied;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 在转调具体目标对象之前,可以执行一些功能处理
System.out.println(proxy.getClass().getName());
System.out.println("Before invoke method...");
// 转调具体目标对象的方法
Object object = method.invoke(proxied, args);
System.out.println("After invoke method...");
return object;
}
}
public static void main(String[] args) {
RealSubject real = new RealSubject();
Subject proxySubject = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(), new Class[] { Subject.class },
new ProxyHandler(real));
proxySubject.doSomething();
}
3.享元模式
如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象,在享元模式中,由于需要构造和维护这些可以共享的对象,常常会出现一个工厂类,用于维护和创建对象。
public class ReportManagerFactory{
Map<String,IReportManager> reportManager=new HashMap<String,IReportManager>();
IReportManager getReportManager(String id){
IReportManager r=reportManager.get(id);
if(r==null){
r=new ReportManager(id);
reportManager.put(id,r);
}
return r;
}
}
4.装饰者模式
装饰者模式拥有一个很巧妙的结构,可以动态添加对象功能。代码复用应该尽可能使用委托,而不是使用继承。装饰者模式充分运用了这种思想,通过委托机制,复用系统中的各个组件,在运行时,可以将这些功能进行叠加,从而构造一个超级对象。
在JDK中OutputStream和InputStream类族的实现是装饰者模式的典型应用,通过嵌套的方式不断的将对象聚合起来,最终形成一个超级对象,并使之拥有所有相关子对象的功能。其中FileOutputStream为系统的核心类,它实现了向文件写入数据。使用DataOutputStream可以在FileOutputStream的基础上,增加多种数据类型的写操作支持,而BufferedOutputStream装饰器,可以对FileOutputStream增加缓冲功能,优化I/O的性能。