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

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

总述

三大设计模式

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

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

思维导图如下所示:

image

关注公众号: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

目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象的实现 10 1.6.5 运用复用机制 13 1.6.6 关联运行时刻和编译时刻的 结构 15 1.6.7 设计应支持变化 16 1.7 怎样选择设计模式 19 1.8 怎样使用设计模式 20 第2章 实例研究:设计一个文档编 辑器 22 2.1 设计问题 23 2.2 文档结构 23 2.2.1 递归组合 24 2.2.2 图元 25 2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35 2.6 支持多窗口系统 35 2.6.1 我们是否可以使用Abstract Factory 模式 35 2.6.2 封装实现依赖关系 35 2.6.3 Window和WindowImp 37 2.6.4 Bridge 模式 40 2.7 用户操作 40 2.7.1 封装一个请求 41 2.7.2 Command 类及其子类 41 2.7.3 撤消和重做 42 2.7.4 命令历史记录 42 2.7.5 Command 模式 44 2.8 拼写检查和断字处理 44 2.8.1 访问分散的信息 44 2.8.2 封装访问和遍历 45 2.8.3 Iterator类及其子类 46 2.8.4 Iterator模式 48 2.8.5 遍历和遍历过程中的动作 48 2.8.6 封装分析 48 2.8.7 Visitor 类及其子类 51 2.8.8 Visitor 模式 52 2.9 小结 53 第3章 创建型模式 54 3.1 Abstract Factory(抽象工厂)— 对象创建型模式 57 3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89 第4章 结构型模式 91 4.1 Adapter(适配器)—类对象结构型 模式 92 4.2 Bridge(桥接)—对象结构型 模式 100 4.3 Composite(组成)—对象结构型 模式 107 4.4 Decorator(装饰)—对象结构型 模式 115 4.5 FACADE(外观)—对象结构型 模式 121 4.6 Flyweight(享元)—对象结构型 模式 128 4.7 Proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 Adapter与Bridge 144 4.8.2 Composite、Decorator与Proxy 145 第5章 行为模式 147 5.1 CHAIN OF RESPONSIBIL ITY(职责链) —对象行为型模式 147 5.2 COMMAND(命令)—对象行为型 模式 154 5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 模式 171 5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 5.12.4 对发送者和接收者解耦 229 5.12.5 总结 231 第6章 结论 232 6.1 设计模式将带来什么 232 6.2 一套通用的设计词汇 232 6.3 书写文档和学习的辅助手段 232 6.4 现有方法的一补充 233 6.5 重构的目标 233 6.6 本书简史 234 6.7 模式界 235 6.8 Alexander 的模式语言 235 6.9 软件中的模式 236 6.10 邀请参与 237 6.11 临别感想 237 附录A 词汇表 238 附录B 图示符号指南 241 附录C 基本类 244 参考文献 249
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页

打赏作者

java冢狐

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值