1 软件设计模式的分类
1.1. 创建型
创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。创建型模式主要有简单工厂模式(并不是23种设计模式之一)、工厂方法、抽象工厂模式、单例模式、生成器模式和原型模式。
1.2. 结构型
用于帮助将多个对象组织成更大的结构。结构型模式主要有适配器模式adapter、桥接模式bridge、组合器模式component、装饰器模式decorator、门面模式、亨元模式flyweight和代理模式proxy。
1.3. 行为型
用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式command、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式state、策略模式、模板模式和访问者模式。
2 常见的设计模式
2.1 单例设计模式
单例设计模式的意图是确保一个类有且仅有一个实例,并且它提供一个全局访问点
很多时候我们需要在应用中保存一个唯一的实例,如后台服务器进程需要一个全局计数器,记录用户访问各个页面的点击数量。如果计数器实例数量非常多,那么势必在计数过程中会出现冲突的情况,为了尽量避免冲突,一个简单的办法就是只有一个计数器实例,所有的计数工作都通过它完成
一般说来单例设计模式分为两类:饿汉式和懒汉式,饿汉式就是一开始就实例化,反之就是懒汉式了。两种实现方式如下:
饿汉式:
class Singleton{
private static final Singleton s = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return s;
}
}
class Singleton{
private static volatile Singleton singleton = null;
private Singleton(){}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
在这里简单解释一下懒汉式加上线程同步锁(synchronized)的原因:当多个线程几乎同时调用Singleton类的getInstance()方法时,静态成员Singleton可能还没有被实例化,因此它可能被不同线程创建了多次,各个线程应用了不同的实例,这就会违背我们“唯一化”的初衷。而用volatile关键字修饰静态成员Singleton,为的是确保多线程访问时,每个线程都能从共享数据中重读改成员变量的值,而当某个线程需要对变量修改时。必须将新值回写到共享内存。这样,两个不同的线程读取的singleton= = null的结果是一致的。
class Singleton{
private static volatile Singleton singleton = null;
private Singleton(){}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}