NewK1ng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Java设计模式

Java设计模式

目录

设计模式的原则

单一职责原则 (SPP Single Responsibility Principle)

  1. 降低类的复杂度,一个类只负责一项职责
  2. 提高类的可读性,可维护性
  3. 降低变更引起的风险
  4. 只有逻辑足够简单,才可以在代码级违反SPP,只有类中方法数量足够少,才可以仅在方法级别遵守SPP

接口隔离原则 (ISP Interface Segregation Principle)

  1. 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上
  2. 解决方法为将接口拆分成若干个独立的接口,并分别实现.此处可以考虑利用接口的继承关系

依赖倒置原则 (DIP Dependence Inversion Principle)

  • 概念
  1. 高层模块不应该依赖低层模块,二者都应该依赖其抽象

  2. 抽象不应该依赖细节,细节应该依赖抽象

  3. 依赖倒置的中心思想是面向接口编程

  4. 设计理念: 相对于细节的多变性,抽象的东西要稳定得多.以抽象为基础搭建的架构比以细节为基础的架构要稳定的多.在Java中,抽象指的是接口或抽象类,细节就是实现类

  5. 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展示细节的任务交给他们的实现类去完成

    理解为实现方式就是面向接口编程,提高代码的可扩展性

  • 要点
  1. 低层模块尽量都有抽象类或接口,或两者都有,程序的稳定性更好
  2. 变量的声明类型尽量是抽象类或接口,这样变量的引用和实际对象间,就存在一个缓冲层,利于程序的扩展和优化
  3. 继承时遵循里氏替换原则

里氏替换原则 (LSP Liskov Substitution Principle)

  1. 所有引用父类的地方必须能透明的使用其子类的对象
  2. 在使用继承时,子类中尽量不要重写父类的方法
  3. 继承实际上让两个类的耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖来解决问题

开闭原则 (OCP Open Closed Principle)

  1. OCP是编程中最基础最重要的设计原则
  2. 一个程序实体,模块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节
  3. 当软件需要变化时,尽量通过扩展来实现,而不是修改

迪米特原则 (DP Demeter Principle)

  • 介绍
  1. 一个对象应该对其他对象保持最少的了解

  2. 类与类关系越密切,耦合度越大

  3. 一个类对自己依赖的类知道的越少越好,因此又叫最少知道原则

  • 要点
  1. 迪米特原则的核心是降低类之间的耦合
  2. 迪米特原则只是要求降低对象间的耦合关系,并不要求完全没有依赖关系

合成复用原则 (CRP Composite Reuse Principle)

尽量使用合成或聚合的方式,而不是使用继承

设计模式的类型

创建型模式

单例模式(Singleton Pattern)

饿汉式
  1. 私有化构造方法
  2. 类内部创建对象
  3. 提供公共方法以返回该对象
  • 优点: 写法简单,避免线程同步问题
  • 缺点: 没有实现懒加载的效果,如果始终没有用到这个对象,会造成内存浪费

静态域变量类型

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;
    }
}
懒汉式
  1. 私有化构造方法
  2. 提供公共方法以返回对象
  3. 如果对象存在则返回,如果对象不存在则创建

线程不安全类型

  • 优点: 起到懒加载的效果
  • 缺点: 只能在单线程下使用

多线程中可能会重复创建对象,破坏单例模式初衷,因此不能使用此方法

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;
    }
}
双重检查方式
  1. 私有化构造方法
  2. 提供公共方法以返回对象
  3. 对实际创建对象的代码添加同步处理,并进行双重判断

优点: 保证线程安全,实现了懒加载效果,效率较高

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;
    }
}
静态内部类方式
  1. 私有化构造方法
  2. 提供公共方法以返回对象
  3. 使用静态内部类提供对象

采用类加载机制保证初始化实例的时候只有一个线程,解决了线程不安全的问题

静态内部类在主类被加载时并不会立即实例化,而在需要时才加载,实现了懒加载的效果

类的静态属性只会在第一次加载时初始化,因此由JVM保证线程安全

class Singleton {
    private Singleton() { }
    public Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
}
枚举方式
  1. 创建一个枚举
  2. 提供一个单例对象
  3. 提供对象可以执行的方法
public class SingletonTest {
    public static void main(String[] args) {
        Singleton instance = Singleton.INSTANCE;
        instance.doMethod();
    }
}
enum Singleton {
    INSTANCE;
    public void doMethod() { }
}

工厂模式(Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)

原型模式(Prototype Pattern)

建造者模式(Builder Pattern)

结构型模式

适配器模式(Adapter Pattern)

桥接模式(Bridge Pattern)

装饰器模式(Decorator Pattern)

组合模式(Composite Pattern)

过滤器模式(Filter、Criteria Pattern)

外观模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

行为型模式

责任链模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

解释器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

备忘录模式(Memento Pattern)

观察者模式(Observer Pattern)

状态模式(State Pattern)

空对象模式(Null Object Pattern)

策略模式(Strategy Pattern)

模板模式(Template Pattern)

访问者模式(Visitor Pattern)

J2EE模式

MVC 模式(MVC Pattern)

业务代表模式(Business Delegate Pattern)

组合实体模式(Composite Entity Pattern)

数据访问对象模式(Data Access Object Pattern)

前端控制器模式(Front Controller Pattern)

拦截过滤器模式(Intercepting Filter Pattern)

服务定位器模式(Service Locator Pattern)

传输对象模式(Transfer Object Pattern)

posted on 2020-12-26 20:42  NewK1ng  阅读(84)  评论(0)    收藏  举报