Java设计模式
Java设计模式
设计模式的原则
单一职责原则 (SPP Single Responsibility Principle)
- 降低类的复杂度,一个类只负责一项职责
- 提高类的可读性,可维护性
- 降低变更引起的风险
- 只有逻辑足够简单,才可以在代码级违反SPP,只有类中方法数量足够少,才可以仅在方法级别遵守SPP
接口隔离原则 (ISP Interface Segregation Principle)
- 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上
- 解决方法为将接口拆分成若干个独立的接口,并分别实现.此处可以考虑利用接口的继承关系
依赖倒置原则 (DIP Dependence Inversion Principle)
- 概念
-
高层模块不应该依赖低层模块,二者都应该依赖其抽象
-
抽象不应该依赖细节,细节应该依赖抽象
-
依赖倒置的中心思想是面向接口编程
-
设计理念: 相对于细节的多变性,抽象的东西要稳定得多.以抽象为基础搭建的架构比以细节为基础的架构要稳定的多.在Java中,抽象指的是接口或抽象类,细节就是实现类
-
使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展示细节的任务交给他们的实现类去完成
理解为实现方式就是面向接口编程,提高代码的可扩展性
- 要点
- 低层模块尽量都有抽象类或接口,或两者都有,程序的稳定性更好
- 变量的声明类型尽量是抽象类或接口,这样变量的引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化
- 继承时遵循里氏替换原则
里氏替换原则 (LSP Liskov Substitution Principle)
- 所有引用父类的地方必须能透明的使用其子类的对象
- 在使用继承时,子类中尽量不要重写父类的方法
- 继承实际上让两个类的耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题
开闭原则 (OCP Open Closed Principle)
- OCP是编程中最基础最重要的设计原则
- 一个程序实体,模块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节
- 当软件需要变化时,尽量通过扩展来实现,而不是修改
迪米特原则 (DP Demeter Principle)
- 介绍
-
一个对象应该对其他对象保持最少的了解
-
类与类关系越密切,耦合度越大
-
一个类对自己依赖的类知道的越少越好,因此又叫最少知道原则
- 要点
- 迪米特原则的核心是降低类之间的耦合
- 迪米特原则只是要求降低对象间的耦合关系,并不要求完全没有依赖关系
合成复用原则 (CRP Composite Reuse Principle)
尽量使用合成或聚合的方式,而不是使用继承
设计模式的类型
创建型模式
单例模式(Singleton Pattern)
饿汉式
- 私有化构造方法
- 类内部创建对象
- 提供公共方法以返回该对象
- 优点: 写法简单,避免线程同步问题
- 缺点: 没有实现懒加载的效果,如果始终没有用到这个对象,会造成内存浪费
静态域变量类型
class Singleton {
private Singleton() { }
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}
静态代码块类型
class Singleton {
private Singleton() { }
private static final Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return INSTANCE;
}
}
懒汉式
- 私有化构造方法
- 提供公共方法以返回对象
- 如果对象存在则返回,如果对象不存在则创建
线程不安全类型
- 优点: 起到懒加载的效果
- 缺点: 只能在单线程下使用
多线程中可能会重复创建对象,破坏单例模式初衷,因此不能使用此方法
class Singleton {
private static Singleton instance;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
线程安全类型,同步方法
- 优点: 起到懒加载的效果,解决了线程不安全的问题
- 缺点: 效率低
实际上创建对象的方法只需执行一次,而不用每次调用进来的时候线程都进行同步,因此不推荐使用此方法
class Singleton {
private static Singleton instance;
private Singleton() { }
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
双重检查方式
- 私有化构造方法
- 提供公共方法以返回对象
- 对实际创建对象的代码添加同步处理,并进行双重判断
优点: 保证线程安全,实现了懒加载效果,效率较高
class Singleton {
private static volatile Singleton instance;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类方式
- 私有化构造方法
- 提供公共方法以返回对象
- 使用静态内部类提供对象
采用类加载机制保证初始化实例的时候只有一个线程,解决了线程不安全的问题
静态内部类在主类被加载时并不会立即实例化,而在需要时才加载,实现了懒加载的效果
类的静态属性只会在第一次加载时初始化,因此由JVM保证线程安全
class Singleton {
private Singleton() { }
public Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
}
枚举方式
- 创建一个枚举
- 提供一个单例对象
- 提供对象可以执行的方法
public class SingletonTest {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
instance.doMethod();
}
}
enum Singleton {
INSTANCE;
public void doMethod() { }
}
浙公网安备 33010602011771号