23种设计模式

文章目录

  • 1、设计模式概述
    • 1.是什么设计模式
    • 2.学习设计模式的意义
    • 3.设计模式的基本要素
    • GoF23
  • oop七大原则
  • 创建型模式
    • 1、工厂模式factory
      • **核心本质**
      • 三种模式
      • 简单工厂模式
      • 简单工厂模式
      • 工厂方法模式
      • 工厂方法模式
      • 抽象工厂方法
        • 介绍
    • 2.单例模式
      • 饿汉式
      • DCL懒汉式
      • 静态内部类
      • (三重检测)
    • 3、原型模式
      • 2、模式结构:
      • 3、实现:
      • 4、测试代码如下
      • 5、总结
    • 4、建造者模式(Builder)
      • 4.1、建造者的定义
      • 4·2、介绍
      • 4·3、实现
      • 测试代码
        • 步骤 1
        • 步骤 2
        • 步骤 3
        • 步骤 4
        • 步骤 5
        • 步骤 6
        • 步骤 7
        • 步骤 8
  • 结构型模式
    • 代理模式
      • 介绍
    • 适配器模式(Adapter)
    • 桥接模式(Bridge)
      • 介绍
      • 实现
      • 介绍
    • 外观模式(Facade):
      • 介绍
    • 享元模式(Flyweight):
      • 介绍
    • 组合模式(Composite)
      • 介绍
    • 组合模式(Composite)
      • 介绍

1、设计模式概述

1.是什么设计模式

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。

通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。

高内聚低耦合

主要解决OOP面向对象设计的一些问题


2.学习设计模式的意义

  • 设计模式的本质是面向对象设计原则的充分运用,是对类的封装性,继承性,多态性以及类的关联关系和组合关系的充分理解
  • 正确使用设局模式的优点
    • 提高编程、思维、设计能力
    • 是程序更加标准化,代码编制更加工程化,提高软件开发效率,缩短软件的开发周期
    • 使代码重用性高,可读性强,可靠性高,灵活性好,可维护性强。

思想即业务,设计模式不一定最好,可能设计一个新的算法更好

3.设计模式的基本要素

  1. 设计模式
  2. 问题
  3. 解决方案
  4. 效果

GoF23

GoF23:一种思维,态度,进步

  • 创建型模式:(主要对象的创建和使用)
    • 单例模式工厂模式,抽象工厂模式,建造者模式,原型模式
  • 结构型模式:(类对象安装某种设计构成一种结构)
    • 适配器模式,桥接,装饰,组合,外观,享元模式,代理模式
  • 行为模式
    • 模板方法模式。。。。太多没写完

oop七大原则

  • 开闭原则:对扩展开放,对修改关闭
  • 里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立。(尽量增加新的功能,不要重写父类方法)
  • 依赖倒置原则:要面向接口编程,不要面向实现编程
  • 单一职责原则:控制类的粒度大小,将对象解耦,提高内聚性。(原子性:一个方法尽量专一)
  • **接口隔离原则:**要为各个类建立它们需要的专用接口
  • **迪米特法则:**只于你的直接朋友交谈,不和陌生人交谈
  • **合成复用原则:**尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

创建型模式

创建型模式关注的是“怎样创建对象”/p>

他的主要特点是:将对象的创建与使用分离!

种类

  1. 单例模式(Singleton):某类只生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
  2. 原型模式(Prototype):将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例
  3. 工厂模式(Factory Method):定义一个用于创建产品的接口,由子类决定生产什么产品!
  4. 抽象工厂模式(Abstra Factory):提供一个创建产品族的接口,每个子类可以选择生产一系列相关的产品。
  5. 建造者模式(Builder):将一个复杂对象分解为多个相对简单的部分,然后根据不同需要创建他们,最后组成该对象

1、工厂模式factory

作用实现了创建者和调用者分离

简单分类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

oop原则

  • 开闭原则:一个软件的实体应当对扩展开放,对修改关闭
  • 依赖倒转原则:面对接口编程
  • 迪米特法则:只与朋友通信

核心本质

  • 实例化对象不用new,使用工厂方法代替
  • 将选择实现类,创建对象统一管理和控制,从而将调用者和我们的实现类解耦。

介绍

**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

**主要解决:**主要解决接口选择的问题。

**何时使用:**我们明确地计划不同条件下创建不同实例时。

**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。

**关键代码:**创建过程在其子类执行。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

**注意事项:**作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

工厂模式 | 菜鸟教程 (runoob.com)


三种模式

简单工厂模式

  • 简单工厂模式

    • 用来生产同一等级结构中的任意产品(对于新增加的产品,覆盖已有的代码)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uG243zNe-1651654148916)(23种设计模式/image-20210520172613075.png)]

  • 工厂方法模式

    • 用来生产同一等级结构中的固定产品,(支持增加任意产品)
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SEBFTUZA-1651654148918)(23种设计模式/image-20210520172902148.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXtHCuVs-1651654148918)(23种设计模式/image-20210520173043077.png)]

工厂方法模式


抽象工厂方法

  • 围绕一个超级工厂创建其他工厂,该超级工厂又被称为其他工厂的工厂。

介绍

**意图:**提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

**主要解决:**主要解决接口选择的问题。

**何时使用:**系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

**如何解决:**在一个产品族里面,定义多个产品。

**关键代码:**在一个工厂里聚合多个同类产品。

**应用实例:**工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

**优点:**当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

**缺点:**产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

**注意事项:**产品族难扩展,产品等级易扩展。

2.单例模式

核心思想

通常普通类的构造方法是公有的,外部类可以通过“new 构造函数()”来生成多个实例。
但是将类的构造函数设为私有,外部类就无法调用。
定义一个静态私有实例,并向外提供一个静态共有函数,用于获取该实例!

饿汉式

饿汉式

DCL懒汉式

DCL懒汉式

静态内部类

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月3日
下一篇 2022年4月3日

相关推荐