什么是创建型模式
创建型模式关注点在于对象创建的过程,可以将对象的创建和使用进行分离,使得用户在使用对象时不需要关注该对象的创建相关的细节,这样可以降低系统的耦合程度,使得方案易于修改易于维护扩展
有哪些创建型模式
1.单例模式 2.工厂模式 3.原型模式 4.建造者模式
接下来针对以上4种设计模式进行单独讲解
1 单例模式
1.1 定义:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法
1.2 应用场景:
单例模式最典型的应用之一便是spring初始化的单例bean.在系统只需要一个实例化对象,例如序列号生成器,计数器,资源管理器等场景中应用较为广泛
1.3 UML图
1.4 具体代码实现:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
1.5 代码解析
在单例类的内部实现只生成一个实例,同时它提供一个静态的getInstance()方法,让客户可以访问它的唯一实例;为了防止在外部对单例类实例化,它的构造函数可见性为private;在单例类内部定义了一个Singleton类型的静态对象,作为供外部共享访问的唯一实例
1.6 代码缺点分析
在单线程模型中该代码确实可以保证系统中只有一个TaskManager类.但是放在多线程环境中来看,第一次调用getInstance方法,会最终生成一个TaskManager类.这时有一个线程在第一个线程还没有生成TaskManager的实例的时候也调用了getInstance方法,由于第一个线程还没有生成TaskManager,所以第二个getInstance方法最终也会执行,这时候由于两个线程都执行了getInstance方法,最终生成了两个TaskManager类
1.7 针对以上缺点的改进
1.7.1 饿汉式单例模式
所谓饿汉式指的是直接对该成员变量进行初始化
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
当类被加载的时候,该静态成员变量instance会被直接初始化,此时该类的私有构造函数被初始化,之后客户端调用getInstance方法时直接返回已经初始化好的instance
1.7.2 懒汉式单例模式
懒汉式单例模式通过synchronized关键字对getInstance方法加锁,保证同一时间只有一个线程会进入该方法中
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}