概括23种设计模式

创建型:对于对象的实例化进行解耦

单例

有且只能有一个实例,且全局可访问。注意懒汉(提前实例化但是浪费内存)和饿汉(延后实例化但是要处理线程安全问题)的区别。

三个工厂(只有后两个属于GOF23种设计模式)

简单工厂

  • 实现:
    定义一个产品接口和诸多实现了该接口的具体产品类
    定义一个工厂类,内含一个生产产品的方法,通过传入的参数来判断实例化哪种产品并返回。

    即只有一个工厂,内置多个生产方法(或者多个if else)

  • 使用案例:
    想获得加法操作对象,就向工厂类的生产产品方法传入字符+,返回new AddOperation()

工厂方法

  • 实现
    也定义一个产品接口和诸多实现了该接口的具体产品类
    注意这里,定义的是工厂接口和诸多实现了该接口的具体工厂类,每个具体工厂类都有对应的生产产品的方法

    即有多个工厂,每个工厂都生产对应的产品

  • 使用案例
    想获得加法操作对象,就调用AddFactorygetOperation方法,返回new AddOperation()

抽象工厂

  • 实现
    相较于工厂方法,为了减少工厂的数量,让每个工厂都可以生产多种产品。
    如小米工厂生产小米手机和小米电脑、华为工厂生产华为手机和华为电脑。
  • 使用案例
    新建小米工厂,调用mi.getPhone获得小米手机,调用mi.getComputer获得小米电脑。华为同理。

建造者

  • 实现
    有零件类、工人类、机器类
    其实就是工人类封装了组装零件的细节,直接返回了机器对象
  • 对比
    - 与工厂模式:工厂模式注重于对新建对象方式的解耦,其新建对象是一步完成的。而建造者模式是需要组装多个部件才能新建完成一个对象的,注重于这个组装的过程及组装顺序。

原型

  • 实现
    其实就是使用了对象的拷贝取代了new,因为二者在效率上是有差异的。

结构型:

适配器

  • 实现
    参考变压器、编译器等。变压器类继承220V电压类、实现变压器接口。5V变压器重写变压方法为转换为5V,10V变压器重写为转换为10V。

桥接

感觉图片会好理解一点
原本的继承关系,不同维度的属性通过层层继承实现
在这里插入图片描述
独立各维度的属性后如下
在这里插入图片描述

组合

  • 实现
    定义叶节点类和非叶节点类,他们都继承节点抽象类,将数据以树形方式构建起来

装饰者

  • 实现
    其实就是把被装饰的东西注入到有装饰方法的对象里,层层包装
  • 使用案例
    奶茶 milkTea = new 奶茶()
    糖添加者 sugar = new 糖添加者(milkTea)
    芋圆添加者 yuYuan = new 芋圆添加者(sugar)
    布丁添加者 buDing = new 布丁添加者(yuYuan)
    sout(buDing)//加了糖、芋圆、布丁的奶茶
    

外观

  • 实现
    封装内部复杂细节(关乎到多个类、多个系统的"复杂",而不只是过程的复杂),对外提供简单接口

享元

  • 实现
    享元即共享的元素,参考Java的常量池,将常用的对象用池子保存并管理,多次调用只会获得同一个对象。

代理

  • 实现
    联想买房的场景,将买房者对象注入中介对象的属性中,让中介提出买房者的要求,接收卖房者的反馈,起到保护买房者的作用。

行为型

访问者TODO

没想明白,先放篇感觉可以的、别人的博客 设计模式之访问者模式

模板

  • 实现
    思想上就是面向对象的继承,使用抽象类和子类继承实现就行

策略

  • 实现
    其实就是将switch-case的各个case用多种策略类表示,这些策略类继承于一个策略基类,以方便修改,即替换对象而不是更改方法细节。

状态

  • 实现
    如果类有状态属性的话,就可以让多种状态以多种状态类表示,对象变换状态就是注入新状态。

观察者

  • 实现
    以师生为例,老师为被观察者,学生为观察者。老师有一个存储学生的集合,老师和学生都有一个进行操作的方法。老师进行操作时,还会调用集合内学生的操作方法。这样子看起来就是"老师一动,学生就动了"。

备忘录

  • 实现
    在正常业务的基础上,定义记录类和记录者类,业务对象新增读取记录方法。在客户端,对于业务对象的每次操作,记录者类根据当前状态创建记录并进行存储和管理,业务对象想读取历史记录时,调用自己的读取记录方法,传入记录者类返回的记录对象即可。

中介者

  • 实现
    参考消息队列。

迭代器

  • 实现
    参考Java、C++的迭代器,即各集合提供统一接口、封装复杂细节

命令

  • 实现
    有命令发送者、命令接收者、命令三个类
    命令对象保存了接收者对象,并有一个成员方法(例如excute)是调用了接收者处理该命令的方法
    发送者只负责调用excute
    这样子就保证了发送者和接收者的解耦,因为发送者无需知道接收者是谁,接收者是在新建命令对象时存储在命令中的,并且是由命令主动去让接收者使用自己的

责任链

  • 实现
    联想到过滤器这东西,一层一层更密的筛子对混合物进行过滤。在代码实现上,每层过滤器都是一个类,且他们都保存了下一层过滤器的引用,以方便在自己这里过滤不了时将混合物送往下一层过滤器进行过滤。而混合物只需调用一次过滤操作就行,过滤的过程由过滤器们联动实现。

解释器(用得少、难理解、遂不概括)

收集了一下设计模式常见优缺点(自行对号入座吧)

优点

  • 提高可复用性
  • 提高可维护性
  • 降低耦合度
  • 降低代码复杂性
  • 提高可读性
  • 提高可扩展性
  • 增强健壮性

缺点

  • 类的数量增多,增加复杂性
  • 系统更抽象,理解难度增加
  • 修改成本增大
  • 扩展困难
  • 容易引入风险
  • 请求处理速度变慢
  • 客户端必须知晓细节并自行决策
  • 增加了资源占用,如内存等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值