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

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

总述

三大设计模式

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

  • 创建型模式主要用于描述如何创建对象(5种)
  • 结构型模式主要用于描述如何实现类或对象的组合(7种)
  • 行为型模式主要用于描述类或对象怎样交互以及怎样分配职责(11种)

思维导图如下所示:

一文总结三大设计模式(23种设计模式)_第1张图片

关注公众号:java冢狐,回复【设计模式】获得高清原图。感谢您的关注。

创建型模式

单例模式

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

饿汉式
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编程环境中常用到的设计模式。这种模式孕育顺序访问集合对象的元素,不需要知道集合对象底层表示。

模板方法模式

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

最后

  • 如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持
  • 欢迎各位关注我的公众号【java冢狐】,专注于java和计算机基础知识,保证让你看完有所收获,不信你打我
  • 如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。

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

image

你可能感兴趣的:(杂谈,设计模式,java,面试)