第十七:单例模式与代理模式

本文介绍了两种单例模式的实现方式:类加载时创建实例和使用时创建实例。此外,还详细阐述了代理模式的设计原理,包括抽象类或接口的定义、真实角色的实现及其业务逻辑,以及代理角色如何通过真实角色属性来实现业务流程。

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

一.

静态的只能访问静态的.单例模式.....每个类只有一个实例

/**
 * 第一种单例模式:类加载的时候就创建
 * */
public class Singleton {
	private static Singleton singleton=new Singleton();
	
	private Singleton(){
		
	}
	
	public static Singleton getInstance(){
		return singleton;
	}
}

/**
 * 第二种单例模式:使用的时候才创建
 * */
public class Singleton2 {
	private static Singleton2 singleton2;
	
	private Singleton2(){
		
	}
	
	public static Singleton2 getInstance(){
		if(null==singleton2){//第一次使用
			singleton2=new Singleton2();
		}
		return singleton2;
	}
}


二.

非静态的什么都可以访问(即可以访问静态的,也可以访问非静态的)

三.

代理模式:以真实角色作为代理角色的属性

1.声明一个抽象类或者接口(有方法)

/**
 * 定义抽象类。抽象角色:规定了真实角色与代理角色共同是实现的接口
 * */
public abstract class Subject {
	public abstract void request();
}


2.让真正角色继承(实现)上面的接口,并写自己的业务逻辑

/**
 * 真实角色。我们要访问的角色
 * */
public class RealSubject extends Subject {
	public void request() {
		System.out.println("From real subject");
	}

}


3.让代理角色也继承(实现)上面的接口,以真实角色作为代理角色的属性,并写自己的业务逻辑(实现真正角色的业务)

/**
 * 代理角色:是客户端与真实的角色之间的桥梁
 * */
public class ProxySubject extends Subject {
	/**
	 * 以真实角色作为代理角色的属性
	 * */
	private RealSubject realSubject ;
	
	public void request() {
		this.preRequest();
		
		if(null==realSubject){
			realSubject=new RealSubject();
		}
		realSubject.request();//真正要完成的事情
		this.postRequest();
	}

	private void preRequest(){
		System.out.println("pre request");
	}
	
	private void postRequest(){
		System.out.println("post request");
	}
}


4.在客户类利用多态,让接口的引用指向代理角色的实例,并调用代理角色的方法

/**
 * 客户端
 * */
public class Client {
	public static void main(String[] args) {
		Subject subject=new ProxySubject();
		subject.request();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值