设计模式
1、常见的设计模式
我们常见的设计模式有工厂模式、代理模式、单例模式、策略模式、观察者模式、包装设计模式、模板方法模式等等。
我们在项目代码编写中手写代码用的比较多,一般就模板方法模式、责任链模式,策略模式、单例模式这些,像工厂模式、代理模式这一类模式手写的代码反而不多。
这一类手写的不多但是大部分我们使用的Spring框架情况下对其还是能够了解,像我们使用的打印日志方法LoggerFactory,还有我们的时间方法DateFormat在我们的框架底层已经是给我们设计好了的经常直接拿来使用的
1.1 单例模式
说到设计模式不得不提三大类中的创建型模式,该类模式下重点关注一个创建,创建什么?创建对象、创建实现过程,它的主要特点是将对象的创建与使用分离,这样在一定程度上降低系统的耦合,方便对项目进行拓展和维护。
而我们的单例模式,在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。
单例模式有以下3个特点:
1)单例类只有一个对象;
2)该单例对象必须由单例类自行创建;
3)单例类对外提供一个访问该单例的全局访问店。
单例模式下分:饿汉式、简单懒汉式(在方法申明时加锁)、DCL双重检验加锁(进阶懒汉式)、静态内部类(优雅懒汉式)、枚举等等。
无论是哪一种,我们都大致分两大类:饿汉式、懒汉式
所谓的饿汉式指还没有被用到就提前直接初始化了对象。
所谓的懒汉式指当需要用到的时候才进行初始化。
/**
* 饿汉买烟
* @author HYF
* 1、该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。
* 2、饿汉式单例在类 创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,以后线程安全
* 的,可以直接用于多线程而不会出现问题。
*/
public class HungryCigarette {
private static final HungryCigarette instance = new HungryCigarette();
private HungryCigarette(){
}
public static HungryCigarette getInstance(){
return instance;
}
}
/**
* 懒汉买烟
* @author HYF
* 1、该模式的特点是类加载时没有生成单例,只有当第一次调用 getInstance 方法才去创建单例。
* 2、如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,
* 否则将存在线程非安全的问题。如果不删除这两个关键字就保证线程安全,但是每次访问时都要同步,
* 会影响性能,且小号更多的资源,这是懒汉式单例的缺点。
*/
public class LazyCigarette {
//保证instance在所有线程中同步
private static volatile LazyCigarette instance = null;
//私有的,避免在外部被实例化
private LazyCigarette(){
}
//getInstance 方法前同步
public static synchronized LazyCigarette getInstance(){
if (instance == null){
instance = new LazyCigarette();
}
return instance;
}
}
/**
* DCL懒汉买烟
* @author HYF
* 方法加锁
*/
public class HungryCigaretteEasy {
//这里一定要volatile修饰防止指令重排导致线程不安全的问题
private static volatile HungryCigaretteEasy hungryCigaretteEasy = null;
private HungryCigaretteEasy(){
}
public static synchronized HungryCigaretteEasy getInstance(){
if (hungryCigaretteEasy == null){