1:单例设计模式

2018 -10-19小米:今天算是从公司实习回来现场面试的第一家公司,一共三轮技术一轮HR面试体验很好!加了一面面试官的微信!感谢每一个面试官!!!!!

总结下面试的知识点和自己不足的地方!喜欢做开发。那就继续做下去吧!

一:各种设计模式:

什么是设计模式?

类比盖房子吧,房子的模型设计,长时间的积累,都有了一个固定的模式。

https://blog.youkuaiyun.com/qq_21439971/article/details/53740109?utm_source=blogxgwz4 七种设计模式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1:单例设计模式:

在这里插入图片描述
单例设计模式主要是控制实例化对象产生个数的设计操作
在这里插入图片描述

1-1懒汉设计模式?

在这里插入图片描述

在这里插入图片描述

开始的时候不使用设计模式,这个时候在主函数里边直接new可以创建多个实例化对象!创建对象需要调用构造方法,这个时候调用的是默认的无参的构造方法。

现在有一个场景:有些对象只需要一个就足够了,如古代皇帝,老婆。(由于某些要求,要求这个类只允许提供有一个实例化对象,此时应该控制的是构造方法,因为有新的实例化对象产生一定需要调用构造方法)

作用:保证整个应用程序中某个实例有且只有一个!(构造方法私有化)

在这里插入图片描述

现在的话就没有办法主函数(也就是外部)直接实例化对象。如下图所示。
在这里插入图片描述

因为构造方法加上了private访问权限:不能被外部类访问,但是可以在类本身调用,所以现在可以考虑在类的内部调用构造方法,产生一个实例化对象,此时的instance属于一个普通的属性(普通属性只有在实例化对象产生后才会被调用,这个时候需要加上static 那么在没有实例化对象的时候通过类名调用就可以访问),
下面是正确做法;
在这里插入图片描述
在这里插入图片描述

面向对象的封装性(类中的属性应该封装后访问):私有化,不允许直接访问我们的成员变量,保证安全。
在这里插入图片描述
这个时候没有办法通过 ‘类.成员变量’ 来直接实例化对象 如下图。

在这里插入图片描述
这个时候需要在单例类中实现一个可以实现返回唯一对象的方法

在这里插入图片描述

这个时候就可以了(整个代码从头强调的是只有一个实例化对象,这个时候虽然提供有static的实例化对象,但是这个时候依然可以被重新实例化,所以保证Singleton类内部的instance无法再次实例化,那么应该使用final定义)

在这里插入图片描述

在这里插入图片描述

注意:1,创建类的唯一实例,使用private static修饰;
2,提供一个用于返回获取实例的方法,使用public static 修饰。

总结:这就是饿汉设计模式:体现在类加载的时候,因为是public static 创建的,就创建一个实例,不管用户用不用,就直接创建出来。
在这里插入图片描述

1-2 饿汉设计模式

在这里插入图片描述
在这里插入图片描述
注意:第二步,我们只是声明实例,没有实例化;也就是说当类加载的时候并没有创建唯一的实例,是在用户获取的时候才真正做判断是否为空,说白了,当第一个用户获取时,instance一定为空,第二次第三次获取实例的时候,就不要再创建实例了,这个我们叫做懒汉设计模式。

两者的区别:

1:饿汉模式的特点是加载类时比较慢(因为对于饿汉模式而言,我们加载类的时候,他就已经创建了类的唯一实例,所以加载比较慢),但是运行时获取对象的速度比较块(因为对象在类加载时就创建了)。

2:懒汉模式的特点是加载类时比较快(因为它在加载类的时候,并没有创建对象,所以加载对象比较快),但运行时获取对象的速度比较慢(因为第一次获取的时候,它没有创建对象,所以比较慢,它需要一个创建对象的过程,所以说创建过程比较慢)。

3: 饿汉模式:线程安全; 懒汉模式:线程不安全。

单例设计模式之-静态内部类实现方式(线程安全):

在这里插入图片描述

在这里插入图片描述

4:静态内部类,使用枚举方式实现(线程安全)

在这里插入图片描述
在这里插入图片描述

5:使用双重校验(线程安全)。

在这里插入图片描述
在这里插入图片描述
6:多例设计模式

class Color{
	private String color;
	private Color(String color) {//构造方法私有化
		this.color=color;
	}
	public static final Color RED = new Color("红色"); 
	public static final Color GREEN = new Color("绿色"); 
	public static final Color BLUE = new Color("蓝色"); 
	public static Color getInstance(String color) {
		switch(color){
		case"red":return RED;
		case"green":return GREEN;
		case"blue":return BLUE;
		default:return null;
		}
	}
	public String toString() {
		return this.color;
	}
}
public class Test{
	public static void main(String args[]) {
		Color c = Color.getInstance("blue");
		System.out.print(c);
	}
}
//蓝色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值