设计模式六大原则
-
开闭原则 对扩展开放,对修改关闭。 为了程序的可扩展性好!
-
里氏代换原则 任何基类可以出现的地方,子类一定可以出现。是继承复用的基石,面向对象设计采用的就是这种思想。这是对开闭原则的补充。
-
单一职责原则 一个类,一个接口只负责一项职责
-
依赖倒转原则 指的是面向接口的编程方式,要依赖于抽象而不依赖于具体
-
接口隔离原则 使用多个隔离的接口,比使用单个接口要好
-
迪米特原则 (最少知道原则)减少类之间的耦合
设计模式的分类
1 创建型模式
隐藏创建对象的逻辑,不是使用new关键字来创建对象。
单例模式,工厂模式,抽象工厂模式,建造者模式。。。
2 结构型模式
关注类和对象的组合,即如何将类或对象按某种布局组成更大的结构
适配器模式,代理模式,享元模式。。。
3 行为型模式
该模式用于描述类或对象之间怎样通信、协作共同完成任务,以及怎样分配职责。
访问者模式,责任链模式。。。
单例模式
保证某个类只有一个实例对象,主要防止一个全局使用的类频繁地创建与销毁它的实例。
1 懒汉式 (线程不安全版)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2 懒汉式 (线程安全版)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3 饿汉式
public class Singleton { //类加载过程保证了线程安全
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
4 双重检查
public class Singleton {
private volatile static Singleton singleton; //volatile防止指令重排,不加可能导致没生成实例的时候就返回
private Singleton() {}
public static Singleton getSingleton() {
if (singleton == null) { //第一次检查
synchronized (Singleton.class) {
if (singleton == null) { //第二次检查
singleton = new Singleton();
}
}
}
return singleton;
}
}
5 静态内部类
public class Singleton { //内部类是延时加载的,在第一次用到它的时候才加载到内存中,实现了lazy loading
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
6 枚举类
枚举类在第一次使用到的时候才被加载。
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
两种懒汉模式不建议使用:普通懒汉线程不安全,加锁懒汉影响性能;
饿汉:唯一缺点就是即使不使用实例,也会在类加载时创建,不能lazy loading;一般用这个就行了
双重检查:既能lazy loading,又能减少锁的影响;但是实现起来比较复杂
静态内部类:比较完美
枚举类:完美。还能防止反序列化和反射破坏单例。