单例模式、静态代理以及内部类的使用

单例模式

单例模式核心的作用是保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

饿汉式:

指在单例类加载的时候就初始化需要单例的对象;饿汉式单例模式的特点是线程安全,调用效率高,但是不能延时加载。

public class Single {
	//类初始化时,立即加载这个对象(没有延时加载优势)。加载类时,线程安全
	private static Single single=new Single();
	//构造器私有化,外部不能调用
	private Single(){
		
	}
	//方法没有同步,调用效率高
	public static Single newInstance(){
		return single;
	}
}

懒汉式

如果单例对象需要占用很大的内存,那么一开始就初始化该对象会一直占用大量的内存。如果不在类加载时初始化,而在想用的时候再初始化这个对象,这是就需要懒汉式的单例模式了。
懒汉式单例模式的特点是线程安全,调用效率不高,但是可以延时加载。

public class Single02 {
	//类初始化时,不初始化这个对象(延时加载,真正用的时候在创建)
	private static Single02 single=null;
	//私有的构造器
	private Single02(){
		
	}
	//公共的访问方式
	public static Single02 newInstace(){
		if(single==null){
			single=new Single02();
		}
		return single;
	}
}

静态代理

  • 真实角色需要和代码角色实现相同的接口
  • 代理需要持有真实角色的引用
  • 代理行为
  • 减少与真实角色的交流,提高代码的安全性,解耦,便于后期维护,代理角色可以扩展功能
public class StaticProxy {
	public static void main(String[] args) {
		Manager manager=new Manager();
		Hr hr=new Hr(manager);
		hr.addUser();
	}
}
interface AddUser{
	void addUser();
}

class Manager implements AddUser{

	@Override
	public void addUser() {
		System.out.println("录用。。。");
	}
	
}

class Hr implements AddUser{
	Manager manager;
	public Hr() {
		
	}
	
	public Hr(Manager manager) {
		super();
		this.manager = manager;
	}

	@Override
	public void addUser() {
		System.out.println("发布招聘信息。。。");
		manager.addUser();
		System.out.println("开始谈薪资。。。");
	}
	
}

在这里插入图片描述

工厂模式

工厂模式实现了创建者和调用者的分离。工厂模式可分为:简单工厂模式、工厂方法模式、抽象工厂模式。这里我们只要了解简单工厂模式即可。

public class Factory {
	public static void main(String[] args) {
		Car car=factory("QQ");
		car.run();
	}
	
	public static Car factory(String name){
		Car car;
		if("QQ".equals(name)){
			car=new QQ();
		}else{
			car=new VV7();
		}
		return car;
	}
}

interface Car{
	void run();
}

class QQ implements Car{

	@Override
	public void run() {
		System.out.println("QQ在跑");
	}
	
}

class VV7 implements Car{

	@Override
	public void run() {
		System.out.println("VV7在跑");
	}
	
}

内部类

内部类是一种特殊的类,它指的是定义在一个类的内部的类。在实际开发中,为了方便使用外部类的相关属性和方法,通常需要定义一个内部类。
内部类的分类:成员内部类(非静态内部类和静态内部类)、匿名内部类和局部内部类。

成员内部类

成员内部类可以使用private、default、protected、public进行修饰。

public class Outer01 {
	private int a=5;
	String str="123";
	//定义内部类
	public class Inner extends A{
		int b=3;
		static final int c=10;
		String str="456";
		
		public void inner(){
			String str="789";
			System.out.println("我是内部类中的成员方法");
			System.out.println(b);
			System.out.println(a);
			
			//局部str
			System.out.println(str);
			//内部类成员str
			System.out.println(this.str);
			//外部类成员str
			System.out.println(new Outer01().str);
		}
		//外部类中的成员方法
		void outer(){
			//内部类对象
			Inner in=new Inner();
			System.out.println(in.b);
		}
	}
}
class A{
	
}

匿名内部类

匿名内部类适合那种只需要使用一次的类

public class Anonymous {
	public static void main(String[] args) {
		/*new Swing(){

			@Override
			public void swing() {
				System.out.println("一边游泳一边喝水");
			}
			
		}.swing();*/
		//有引用接收的匿名内部类对象
		/*Swing s=new Swing(){

			@Override
			public void swing() {
				System.out.println("一边游泳一边敲代码");
			}
			
		};
		s.swing();*/
		
		//作为方法的参数使用
		test(new Swing(){
			@Override
			public void swing() {
				System.out.println("一边敲代码一边玩游戏");
			}
		});
	}
	
	static void test(Swing s){
		s.swing();
	}
}

interface Swing{
	void swing();
}

Lamdba表达式

Lambda表达式 jdk1.8的新特性

  • 作用:用来简化匿名内部类

  • 前提: 函数式接口

  • 函数式接口: 只有一个抽象方法的接口就是函数式接口

  • 检查函数式接口: @FunctionalInterface

  • 语法:

  •  ()->{}
    
  •  () ->抽象方法的参数列表
    
  •  -> 箭头函数|Lambda符号,具有上下文推到的作用
    
  •  {} 抽象方法的方法体
    
public class LambdaDemo {
	public static void main(String[] args) {
		Pizza p=null;
		/*
		//匿名内部类
		Pizza p=new Pizza(){
			@Override
			public void show(int a) {
				System.out.println("我会匿名内部类");
			}
		};
		//Lamdba表达式写法1:
		p=()->{System.out.println("我是Lamdba表达式写法1");};
		
		//Lamdba表达式写法2:如果方法体语句只有一句,前后的{}可以省略
		p=()->System.out.println("我是Lamdba表达式写法2");
		
		//Lamdba表达式写法3:如果抽象方法有参数,参数的数据类型可以省略
		p=(a)->System.out.println("我是Lamdba表达式写法3");
		
		//Lamdba表达式写法4:如果抽象方法参数只有一个,前后的()可以省略
		p=a->System.out.println("我是Lamdba表达式写法4");
		
		//Lamdba表达式写法5: 如果语句体只有一句,但是是return的话,前后的{}与return关键字可以一起省略
		p=a-> "我是Lamdba表达式写法5";
		System.out.println(p.show(1));
		*/
		p.show(1);
	}
}
interface Pizza{
	//void show(int a);
	String show(int a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值