设计模式概述
设计模式是一套被重复应用,少数人通晓的,通过分类编目标代码设计教训的总结。它形容了在软件设计过程中的一些一直反复产生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计教训的总结,具备肯定的普遍性,能够重复应用。其目标是为了进步代码的可重用性,可读性和可靠性
设计模式的六大设计准则
- 开闭准则
核心思想: 对扩大凋谢,对批改敞开
也就是说,对曾经应用的类的改变是通过减少代码进行的,而不是通过批改原有代码 - 繁多职责准则
能够了解为高内聚,低耦合;也就是说每个类应该只有一个职责,对外只提供一种性能,而引起类变动的起因应该只有一个 - 里氏替换准则
核心思想: 在任何父类呈现的中央都能够应用其子类来代替
任何呈现父类或者接口的中央,都能够应用子类的实现去代替。也就是说,同一个继承体系中的对象应该有独特的行为特色 - 依赖倒转准则
核心思想: 要依赖于接口和抽象类,不要依赖于具体的实现
在应用程序中,所有的类如果应用或者依赖于其余的类,则应该依赖于这些类的抽象类或者接口,而不是间接依赖这些类的实现类 - 接口拆散准则
核心思想: 程序不应该依赖它们不须要应用的办法
一个接口中不须要提供太多的行为,一个接口应该只提供一种对外的性能,不应该将所有的操作都封装到一个接口中 - 迪米特准则 (起码认知准则)
核心思想: 一个对象该当对其余的对象尽可能少的了解
用于升高各个对象之间的耦合,进步零碎的可维护性
设计模式的三种类型
- 创立型模式
创立型模式包含单例模式,工厂办法模式,形象工厂模式,建造者模式,原型模式 - 结构型模式
结构型模式包含代理模式,适配器模式,装璜模式,亨元模式,外观模式,桥接模式,组合模式 - 行为型模式
行为型模式包含模版办法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
对于设计模式的一些基本概念就介绍到这里,上面进入本节的正题 – 单例模式
单例设计模式
单例设计模式是一种罕用的设计模式。在 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;}
}