一文总结三大设计模式(23种设计模式)

Posted java冢狐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文总结三大设计模式(23种设计模式)相关的知识,希望对你有一定的参考价值。

    昨天我们介绍了设计模式的七大原则,今天我们介绍一下设计模式中的三大分类具体23种设计模式。

总述

三大设计模式

    三大设计模式分别是:创建型、结构型、行为型三种

  • 创建型模式主要用于描述如何创建对象(5种)

  • 结构型模式主要用于描述如何实现类或对象的组合(7种)

  • 行为型模式主要用于描述类或对象怎样交互以及怎样分配职责(11种)

思维导图如下所示:

设计模式

创建型模式

单例模式

    内存中只会创建且仅创建一次对象的设计模式。

饿汉式
public class Singlenton{
    // 只实例化一次
    private final static Singleton INSTANCE = new Singleton();
    // 私有构造方法,防止被实例化
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;   
    }
}
懒汉式(双重检查)
public class Singleton{
    // 使用volatile修饰,让变量每次使用的时候从主存主取而不是从各个线程的“工作内存”中
    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;
    }
}
静态内部类模式
public clsaa Singleton{
    // 私有构造方法,防止被实例化
    private Singleton(){}
    // 使用一个内部类来维护单例,只有在改类被加载的时候,才会实例化对象
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }
    // 获取实例
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}
  • 饿汉模式升级版,解决了资源浪费的问题,同时也保证了线程安全;只有在内部类被加载的时候,才会去实例化对象;相对于懒汉式,静态内部类的方式避免了排队进同步块做null判断,性能也优于懒汉模式,推荐使用

枚举模式
public enum Singleton{
    INSTANCE;
    public Singleton getInstance(){
        return INSTANCE;
    }
}
  • 线程安全,由JVM来保证线程安全和单一实例,在反射和序列化场景中,仍能保证单一实例。

工厂模式

简单工程模式

    创建一个统一的工厂类,根据传入的参数不同创建不同的对象,需要在一堆产品中选则其中一个产品。

工厂模式

    工厂模式不是用一个统一的工厂类来管理所有的对象,而是每一个对象都有不同的工厂相对应

抽象工厂模式

    抽象工厂模式是对工厂模式的进一步优化,工厂类不单单只能创建一个对象,而是创建一组对象

简单工厂模式是外部传值进去,以获取不同对象

抽象工厂模式直接通过方法获取对象,不需要传值

建造者模式

    将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。

    就是构造的时候只传必须的参数,其他参数通过set方法可选传入。

说明
  • 在类中创建一个静态内部类Builder,然后将类中的参数都复制到Builder类中

  • 在类中创建一个private的构造函数,参数为Builder类型

  • 在Builder中创建设置函数,对类中那些可选参数进行赋值,返回值为Builder类型的实例

  • 在Builder中创建一个build()方法,在其中构件类的实例并返回。

原型模式

    使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。

结构型模式

适配器模式

    目的在于适配接口

类适配
  • 有一个已存在的将被适配的类

public class Adaptee{
    public void adapteeRequest(){
        System,out,println("被适配者的方法");
    }
}
  • 定义一个目标接口

public interface target{
    void request();
}
  • 通过适配器,实现接口继承类,然后调用父类方法即可。

装饰器模式

    装饰模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为一个现有的类的一个包装。

    动态的添加功能。

代理模式

    在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式;在代理模式中,我们创建具有现有对象的对象,以便向外提供功能接口

    主要分为静态代理和动态代理

外观模式

    外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,以隐藏系统的复杂性

    这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用

    外观模式就是将他们的关系放在一个Facade类中,降低了类与类之间的耦合度。

桥接模式

    桥接是用于把抽象化与实现化解耦,使得二者可以独立变化。通过提供抽象化和实现化之前的桥接结构,来实现二者的解耦。

    这种模式涉及到一个作为桥接的接口,使得是立体的功能独立于接口实现类。这两种类型的类可以被结构化改变而互不影响。

组合模式

    是用于把一组相似的对象当做一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式。它创建了对象组合树形结构

    创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式

享元模式

    主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式

    尝试重用现有的同类对象,如果未找到匹配的对象,则创建新的对象。

行为型模式

策略模式和状态模式

相同点
  • 两者通过将行为和状态拆分成一系列小的组件,由条件和状态进行功能更替,这样更符合开闭原则,便于扩展,此外两者均可作为if else或者分支的替代方案;支持的最大行为和状态均有限

不同点
  • 策略模式中,类的功能是根据当前条件主动更改

  • 状态模式中,类的功能是被动由当前状态更改

  • 策略模式中每个行为或算法之间没有关联

  • 状态模式中的状态之间有关联,并且状态本身

解释器模式

    提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等。

观察者模式

    当对象间存在一对多关系时,则使用观察者模式。比如当一个对象被修改时,则会自动通知它依赖的对象

中介者模式

    中介者模式是用来降低多个对象和类之间的通信复杂度。这种模式提供了一个中介类,该类通常处理不同类之间的通信,支持松耦合,使代码易于维护

备忘录模式

    保存一个对象的某个状态,以便在适当的时候恢复对象。

命令模式

    命令模式是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。

责任链模式

    为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。

访问者模式

    我们使用一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式、元素对象已接收访问者对象,这样访问者对象就可以处理元素对象上的操作。

迭代器模式

    是java和.net编程环境中常用到的设计模式。这种模式孕育顺序访问集合对象的元素,不需要知道集合对象底层表示。

模板方法模式

    一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

最后

  • 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持

  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。

——我是冢狐,和你一样热爱编程。

扫码关注我



以上是关于一文总结三大设计模式(23种设计模式)的主要内容,如果未能解决你的问题,请参考以下文章

一文分清23种设计模式-设计模式及PK小结

深入理解Java中23种设计模式

设计模式解密(23) - 总结篇

23种设计模式的分类和应用场景总结设计模式

23种设计模式的分类和应用场景总结设计模式

图文详解 23 种设计模式