单例模式是Java中最简单的设计模式之一。 这种类型的设计模式是一种创建模式,它提供了创建对象的最佳方式。
此模式涉及一个类,该类负责创建自己的对象,同时确保只创建一个对象。 此类提供了一种直接访问其独特对象的方法,而无需实例化该类的对象。
其最重要的特点是:
一个类只能有一个实例
单例模式有五种,但是有两种是我们早期学习必须掌握的,也是我们今天要讲的两种:懒人风格和饥饿人风格。
惰性风格:只有在第一次调用函数后才创建对象。 它不是线程安全的并且相对高效。
饿汉式:类第一次加载后创建对象。 它是线程安全的并且效率相对较低。
但无论是懒人式还是饿人式,都采用相同的三个步骤来实现:
建筑商私有化
提供对该类的静态、私有引用
公共静态访问方法,返回该类的对象
具体说明如下:
饿了么中国风
2. 提供对该类的静态私有引用 --> 存储创建的唯一对象
=新的();
1. 建设者私有化。 不允许在控件之外直接创建对象,因为无法调用构造函数。
() {
// TODO 自动存根
3.公共静态访问方法返回值:类型,该对象存储在
(){
;
懒人风格
2.对该类的私有静态引用
=空;
1.私有构造函数
(){
// TODO 自动存根
3.公共静态访问方法
(){
如果(==空){
=新的();
;
代理模式
代理模式是一种设计模式,简单来说就是在不改变源代码的情况下扩展目标对象的功能。
代理模式分为:
静态代理模式 动态代理模式 Cglib代理
同样前期,我们首先学习动态代理模式。 静态代理模式的优点是:解耦、操作简单、后期维护方便。
在静态代理中,我们可以做这样的类比:
主要分为:真实角色:房东| 你想结婚| 专案经理
代理角色: 房地产代理 | 婚庆公司| 小时
真正的角色是业务需求最迫切的人,比如房东。 他想租房子。 如果没有经纪人,他需要与租客一一沟通,协商合同。 但如果有房产中介有代理角色,那么他只需要告诉代理自己租房的需求,然后代理会帮他和客户谈判,最后让房东和客户签合同。合同。 这样做的好处很大,让工作变得更轻松。
那么这里的代理角色和真实角色通过一个租房的委托任务通过事件连接起来。 在代理模型中,这就是接口。
真实角色需要实现与代理角色相同的接口:相同的实现目的-->租房子
代理角色持有对真实角色的引用
代理行为
我们先来了解一下工厂代理模式:
抽象产品角色:父接口 | 由特定产品角色实现的父类
具体产品作用:实现类| 抽象产品角色的子类
工厂角色:生产产品
例子:
班级 {
无效主([]参数){
汽车 car=("Mes");
汽车.运行();
//工厂角色创建不同的汽车
汽车(名称){
汽车 car=null;
if(名字。(“Mes”)){
汽车=新Mes();
}别的{
汽车=新野马();
车;
车{
无效运行();
//奔驰
类 Mes 汽车{
@
无效运行(){
.out.(“坐在引擎盖上哭……”);
//野马
野马车类{
@
无效运行(){
.out.("野马...");
内部类
在 Java 中,一个类可以在另一个类或方法内定义。 这样的类称为内部类。 广义的内部类一般包括以下四种类型:
成员内部类静态内部类局部内部类匿名内部类
成员内部类:
内部类被定义为外部类的成员
成员内部类定义在成员位置,可以使用成员修饰符进行修改,具有成员的特性。
内部类 --> 继承类的特性并实现...
要使用成员内部类中的内容,根据外部类的对象来使用。
成员内部类中不能定义静态内容,静态常量除外
静态内部类
静态内容只能在静态内部类中定义,静态常量除外
要在静态内部类中使用外部类的成员内容,必须使用外部类对象,因为内部类是静态的,静态内容中不能直接使用非静态内容。
外部类可以通过内部类名直接使用内部类中的静态内容,但成员必须通过静态内部类的对象来使用。
本地内部类:
在外部类的方法中定义
局部内部类只能通过当前定义的方法中的对象来使用
如果该方法的参数用在局部内部类中,则该参数必须用final修饰。 JDK1.8默认省略final。
匿名内部类:
匿名内部类的作用:简化实现、子类、不浪费类名、未定义的结构
匿名内部类的对象
新抽象类| name() { --相当于实现类或子类的类体
例子:
三种表达方式:
其中游泳是界面
游泳{
空白 ();
无效睡眠();
抖音()1)只能使用这个
new Swim(){ 抖音()-->作为Swim接口实现类的类体
@
空白 () {
.out.("自由式...");
@
无效睡眠(){
.out.("在有用的时候睡觉..");
}。睡觉();
//2. 引用指向匿名内部类对象
Swim s=new Swim(){ //接口多态
@
空白 () {
.out.("自由式...");
@
无效睡眠(){
.out.("在有用的时候睡觉..");
};
s.();
s.sleep();
//3)匿名内部类作为方法的参数
测试(新游泳(){
@
空白 () {
.out.(“哈哈哈哈”);
@
无效睡眠(){
// TODO 自动存根
});
第三种方法需要在同一个类之外添加一个方法:
无效测试(游泳){
s.();
表达
表达-->jdk1.8新特性
作用:简化匿名内部类
()->{}
() : 重写方法的参数列表
-> :箭头符号:具有上下文推送功能
{}:被重写的抽象方法的方法体
先决条件:功能接口
函数式接口:只有一个抽象方法的接口
测试是否是函数式接口@
抽象类:可以使用匿名内部类,但不能使用表达式
并非所有匿名内部类都可以使用简化。 如果可以使用,建议使用表达式
例子:
表达式写法1
s=()->{
.out.(“吸烟有害健康!!!!!!!!!”);
};
写法二:如果表达式的方法体语句只有一句,前后的{}可以省略。
s=()->.out.("吸烟有害健康!!!!!!!!!");
写法三:参数的数据类型可以省略
s=(x,y)->.out.("吸烟有害健康!!!!!!!!!"+x+y);
写法四:如果只有一个参数,则和after()可以省略
s= x -> .out.("吸烟有害健康!!!!!!!!!"+x);
写法五:如果方法有返回值,方法体只有语句,则前后的{}和关键字可以省略。
s = x - > {
.out.("吸烟有害健康!!!!!!!!!"+x);
“你好”;
};