原型
拷贝对象
public class ProImp {
.......
/**
* 克隆一个自己,因没有属性,不用复制值
*/
public Object clone(){
ProImp a = new ProImp();
a.xxx = xxx;
return a;
}
}
Ojbect的 clone()每次克隆获取的是同一个实例。指向的是同一内存空间。
clone一个对象,一般是有值的,但是new一个对象是不一定有值
代理
1+N hibernate的经典问题。
代理用来控制对象的访。
自己实现的代理常叫静态代理,这样的实现在接口变化时,修改较多。 JDK支持动态代理。JAVA的动态代理目前依靠代理接口InvocationHandler:反射+动态生成class技术,来动态生成被代理的接口实现对象。 cglib等第三方工具包也提供了。
JDK
public class DynamicProxy implements InvocationHandler {
private Subject sb = null;
public DynamicProxy(Subject sb){
this.sb = sb;
}
public Subject getProxyInterface(RealSubject rs){
//设置被代理对象,方便invoke操作
this.sb = rs ;
//将真正的订单对象和动态关联起来
Subject sub = (Subject)Proxy.newProxyInstance(
RealSubject.class.getClassLoader(),
RealSubject.class.getInterfaces(),
this);
return sub;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//if(method.getName().startsWith(""))
return method.invoke(sb, args);
}
}
RealSubject rs = new RealSubject();
DynamicProxy dp = new DynamicProxy(rs);
Subject sb = dp.getProxyInterface(rs);
sb.doSomeThing();
static
public class ProxySubject implements Subject {
private Subject real = null; // 持有被代理的具体的目标对象
public ProxySubject(Subject sub) {// 构造方法传入被代理的目标对象
real = sub;
}
public void doSomeThing() {
// 可以在这里加些权限或者其它数据完整性的判断,如果通过则继续
before(); // 有点像前置通知
if (null != real)
real.doSomeThing();
end(); // 有点像后置通知
}
public void before() {
System.out.println("in" + ProxySubject.class + " before() ");
}
public void end() {
System.out.println("in" + ProxySubject.class + " end() ");
}
}