设计模式概述
设计模式是一套被反复使用,多数人知晓的,经过分类编目的代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性,可读性和可靠性
设计模式的六大设计原则
- 开闭原则
核心思想: 对扩展开放,对修改关闭
也就是说,对已经使用的类的改动是通过增加代码进行的,而不是通过修改原有代码 - 单一职责原则
可以理解为高内聚,低耦合;也就是说每个类应该只有一个职责,对外只提供一种功能,而引起类变化的原因应该只有一个 - 里氏替换原则
核心思想: 在任何父类出现的地方都可以使用其子类来代替
任何出现父类或者接口的地方,都可以使用子类的实现去替代。也就是说,同一个继承体系中的对象应该有共同的行为特征 - 依赖倒转原则
核心思想: 要依赖于接口和抽象类,不要依赖于具体的实现
在应用程序中,所有的类如果使用或者依赖于其他的类,则应该依赖于这些类的抽象类或者接口,而不是直接依赖这些类的实现类 - 接口分离原则
核心思想: 程序不应该依赖它们不需要使用的方法
一个接口中不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该将所有的操作都封装到一个接口中 - 迪米特原则(最少认知原则)
核心思想: 一个对象应当对其他的对象尽可能少的理解
用于降低各个对象之间的耦合,提高系统的可维护性
设计模式的三种类型
- 创建型模式
创建型模式包括单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式 - 结构型模式
结构型模式包括代理模式,适配器模式,装饰模式,亨元模式,外观模式,桥接模式,组合模式 - 行为型模式
行为型模式包括模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
关于设计模式的一些基本概念就介绍到这里,下面进入本节的正题--单例模式
单例设计模式
单例设计模式是一种常用的设计模式。在Java应用中,单例对象能够保证在一个JVM中,该对象的只有一个实例存在。所以单例类会具有以下的特点
1. 单例类只有一个实例对象
2. 实例对象由单例类自行提供
3. 单例类对外提供一个访问该单例的全局访问点
由此可以推断出单例类的构成: 构造器私有化,提供静态的方法供外部获取单例类的对象
单例模式的分类
单例模式有两种写法,懒汉式和饿汉式,饿汉式单例的写法很简单,直接创建对象即可
public class Singleton {
// 构造私有
private Singleton(){}
private static Singleton singleton = new Singleton();
// 提供静态方法供外部获取实例
public Singleton getSingleton(){
return singleton;
}
}
懒汉式单例是在需要使用时才会创建实例,懒汉式单例有以下几种写法
写法一:
public class Singleton {
// 构造私有
private Singleton(){}
private static Singleton singleton = null;
// 提供静态方法供外部获取实例
public static Singleton getSingleton(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
在写法一的代码中,程序处于低并发时,可能不会出现问题,但是在高并发的情况下,内存中可能会出现多个实例,这样就违反了单例模式的原则,解决线程安全问题的方法有多种,最为简单的一种就是直接在获取实例的方法上加上synchronized关键字,但是直接锁方法会影响程序的效率,这里提供一种双重检测的写法
写法二:
public class Singleton {
// 构造私有
private Singleton(){}
private volatile static Singleton singleton = null;
public static Singleton getSingleton(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
除了写法二,这里再提供一种线程安全的懒汉式单例写法
public class Singleton {
// 构造私有
private Singleton(){}
// 此处使用一个内部类来维护单例
private static class SingletonFactory{
private static Singleton singleton = new Singleton();
}
public static Singleton getSingleton(){
return SingletonFactory.singleton;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。