1.单例模式
单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。 属于设计模式三大类中的创建型模式。
单例模式具有典型的三个特点:
- 只有一个实例。
- 自我实例化。
- 提供全局访问点。
常见的单例模式实现方式有五种:饿汉式、懒汉式、双重检测锁式、静态内部类式和枚举单例。
1. 饿汉模式
第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例
第三步:提供一个公有的静态方法,返回对象实例
饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。
缺点: 即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return instance;
}
}
2.懒汉模式(线程安全)
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}
第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例,先赋值为空
第三步:提供一个synchronized 修饰的公有静态方法,如果实例为空,new一个对象实例返回
缺点:加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多
3.双重校验锁
public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例,先赋值为空
第三步:提供一个的公有静态方法getInstance,如果实例为空,对单例的class类用synchronized 修饰,判断实例为空,new一个对象实例返回
4.常见应用场景
网站计数器。
项目中用于读取配置文件的类。
数据库连接池。因为数据库连接池是一种数据库资源。
Spring中,每个Bean默认都是单例的,这样便于Spring容器进行管理。
Servlet中Application
Windows中任务管理器,回收站。
2.工厂模式
工厂模式分为简单工厂模式,工厂方法模式、抽象工厂模式,
其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。
1.简单工厂模式
简单工厂模式中工厂负责生产所有产品,需要有一个产品接口,其次是具体的产品去实现这个接口,然后有一个Factory工厂类来生产这些产品。
最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。
2.工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好
3.抽象工厂
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。