什么是设计模式
是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。话语来自百度
设计模式有什么作用
设计模式是基于场景的解决方案
java一共多少种设计模式
设计模式大概分类
单例设计模式
目的:就是为了使得类的一个对象成为该类系统中的唯一实例
定义:一个类有且仅有一个实例,并且自行实例化整个系统提供
要点:某个类只有一个实例,必须自行创建实例,必须自行向整个系统提供这个实例
实现
1.只提供私有的构造方法
2.含有一个该类的静态私有对象
3.提供一个静态的公有方法用于创建、获取静态私有方法
代码实现方式
1.饿汉式(对象创建过程中实例化)
创建一个类
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/06/02/18:39
*
* 饿汉式 : 创建对象实例的时候直接初始化
*/
public class SingLeton {
//1、创建类中私有构造 只提供私有构造方法
private SingLeton(){
}
//2、创建该类型的私有静态实例 instance 代表实例的意思
private static SingLeton instance = new SingLeton();
//3、创建公有静态方法返回实例对象
public static SingLeton getInstance(){
return instance;
}
}
创建一个测试类,发现不管怎么拿都是一个对象,创建这个实例的时候就加载这个对象在堆内存中
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/06/02/18:48
*/
public class Test {
public static void main(String[] args) {
//这个构造函数时无法被访问到的
SingLeton one = SingLeton.getInstance();
SingLeton two = SingLeton.getInstance();
// 发现得到的都是一个 单例对象
System.out.println(one);
System.out.println(two);
}
}
该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会),这种它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能
2.懒汉式(静态公有方法实列化)
创建一个类
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/06/02/19:03
*
* 饿汉式 类内实例对象创建时并不是直接初始化,直到第一次调用get方法时,才完成初始化的操作
*/
public class SingLetonTwo {
//1、创建私有构造方法
private SingLetonTwo(){
}
//2、创建静态的该实例对象
private static SingLetonTwo instance = null;
//3、创建开放的静态方法提供实例对象
public static SingLetonTwo getInstance(){
//如果为空就实例化
if(instance == null){
instance = new SingLetonTwo();
}
return instance;
}
}
创建测试类
/**
* Created with IntelliJ IDEA.
*
* @Auther: Adger
* @Date: 2020/06/02/18:48
*/
public class Test {
public static void main(String[] args) {
//这个构造函数时无法被访问到的
SingLetonTwo one = SingLetonTwo.getInstance();
SingLetonTwo two = SingLetonTwo.getInstance();
System.out.println(one);
System.out.println(two);
}
}
创建实例的时候并不是像饿汉式一样初始化
单例中的饿汉式与懒汉式区别
饿汉式:在类的 加载时就创建实例,线程是安全的
懒汉式:第一次使用时进行实例化,懒汉式存在线程风险,可以解决(同步锁,双重校验锁,静态内部类,枚举)解决
单例模式
优点
1、在内存中只有一个对象,节省内存空间
2、避免频繁的创建销毁对象,提高性能
3、避免对共享资源的多重占用
缺点
1、扩展比较困难
2、如果实例化的对象长期不利用,系统将默认为垃圾回收,造成对象状态丢失
使用场景
1、创建对象时占用资源过多,但同时又需要用到该类对象
2、对系统内资源要求统一读写,如读写配置信息,配置文件的读写
3、当多个实例存在可能引起程序逻辑错误的时候