java代理模式和单利模式

本文深入解析了代理模式和单例模式的实现原理及应用场景。代理模式通过两个子类共现一个接口,实现代理操作;单例模式确保类只创建一个实例,提供全局访问点。文中提供了具体的代码示例,包括静态代理、动态代理和两种单例模式的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代理模式

两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。这就像极了我们的代购操作。虽然真正买东西付钱的是我,可是我是通过代购的人代替我去实体店买的。
代理模式组成:
1.接口 --定义操作
2.真实主题类–
3.代理类。
举个例子:买口红

package www.Factory;
//接口定义具体操作-这里是买口红
interface  IBuyRouge{
    void buyRouge();
}
//真实的主题类,就是我真实给钱的
class RealBuyRouge implements IBuyRouge{
    public void buyRouge(){
        System.out.println("buy YSL");
    }
}
//代理类,替我去买的
class ProxyBuyRouge implements IBuyRouge{
    private IBuyRouge realBuyRouge;
    ProxyBuyRouge(IBuyRouge realBuyRouge){
        this.realBuyRouge =realBuyRouge;
    }
    public void buyRouge() {
        this.realBuyRouge.buyRouge();
    }
}
public class Subject{
    public static void main(String[] args) {
        IBuyRouge buyRouge = new ProxyBuyRouge(new RealBuyRouge());
        buyRouge.buyRouge();
    }
}

用反射模型改写代理模型:

import java.lang.reflect.Constructor;

interface ISubject{
    void buy();
}
class RealSubject implements ISubject{
    @Override
    public void buy() {
        System.out.println("买糖吃");
    }
}
class ProxySubject implements ISubject{
    private ISubject subject;
    public ProxySubject(ISubject subject){
        this.subject = subject;
    }
    public void beforeBuy(){
        System.out.println("排队");
    }
    public void afterBuy(){
        System.out.println("发快递");
    }
    public void buy(){
        this.beforeBuy();
        this.subject.buy();
        this.afterBuy();
    }
}
class Factory {
    private Factory() {
    }
    public static <T> T getInstrance(String proxyClassName,
                                     String realClassName){
        T t = null;
        T realObj = getInstrance(realClassName);
        try {
            Constructor<?> cons = Class.forName(
                    proxyClassName).getConstructor(
                            realObj.getClass().getInterfaces()[0]);
            t = (T)cons.newInstance(realObj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

    private static <T> T getInstrance(String className) {
    T t = null;
        try {
            t = (T)Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }
}
public class Test{
    public static void main(String[] args){
        ISubject subject = Factory.getInstrance("quanlujing.ProxySubject",
                "quanlujing.RealSubject");//类的全路径名称
        subject.buy();
    }
}

用动态代理模型:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface ISubject{
    void buy();
}
class RealSubject implements ISubject{
    @Override
    public void buy() {
        System.out.println("买糖吃");
    }
}
class ProxySubject implements InvocationHandler{
    private Object subject;
    public void beforeBuy(){
        System.out.println("排队");
    }
    public void afterBuy(){
        System.out.println("发快递");
    }
    public Object bind(Object obj){
        this.subject = obj;
        return Proxy.newProxyInstance(subject.getClass().getClassLoader(),
                subject.getClass().getInterfaces(),this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       this.beforeBuy();
       Object ret = method.invoke(this.subject,args);
       this.afterBuy();
       return ret;
    }
}
public class Test{
    public static void main(String[] args){
        ISubject subject =(ISubject) new ProxySubject().
                bind(new RealSubject());
        subject.buy();
    }
}

单利模式

单利模式要求一个类仅允许产生一个实例化对象。
具体要求:
1.构造方法私有,类的外部无法实例化
2.类内部实例化对象,类外部通过类内的静态get方法获取该实例化出的对象。

饿汉式单利模式 --上来就new

class Singletion{
	private staitc final Singletion singletion = new Singletion();
	private Singletion(){};//构造私有
	public static Singletion getSingletion(){
		return singletion;	
	}
}
public class Test{
	public static void main(String[] args){
		Singletion singletion = getSingletion();
	}
}

懒汉式单利模式–用时才new

class Singletion{
 	private staitc Singletion singletion ;
 	private Singletion(){};//构造私有
 	public static Singletion getSingletion(){
 		if(singletion == null){
			singletion = new Singletion();
		}
  		return singletion; 
 	}
}
public class Test{
 	public static void main(String[] args){
  		Singletion singletion = getSingletion();
	 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值