建造者模式-Builder Pattern

引言

现在一般大型的业务系统中的消息通知的形式都会有多种,比如短信、站内信、钉钉通知、邮箱等形式。虽然信息内容相同,但是展现形式缺不同。如短信使用的是纯文本的形式,钉钉使用的一般是Markdown的形式,而邮箱则使用HTML形式。那如何处理这种差异呢?

建造者模式就是一个很好的选择,使用不同的建造者,来构造不同的消息。

定义及实现

建造者模式(Builder Pattern)是一种创建型设计模式,它可以让你构建复杂对象时更加灵活和可控。这种模式的主要目的是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

在软件开发中,我们经常会遇到一些复杂的对象,这些对象通常由多个部分组成,而且每个部分的创建和组合可能需要花费大量的时间和精力。为了解决这个问题,我们可以使用建造者模式来简化对象的构建过程。

建造者模式的核心思想是将复杂对象的构建过程分解为多个简单的步骤,每个步骤负责创建一个特定的部分。这些步骤被封装在一个单独的类中,称为“建造者”(Builder)。通过这种方式,我们可以逐步构建复杂对象,同时保持代码的可读性和可维护性。

定义

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

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

阅读更多

原型模式-Prototype Pattern

引言

在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 gettersetter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,还可以实现不同类型之间的拷贝。

如果仅考虑相同对象之间的拷贝,有没有什么更优雅的方式呢?那就是原型模式。

定义及实现

定义

Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

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

阅读更多

设计模式内容汇总

此专题中包含7种设计原则,23种设计模式的介绍。

设计模式是一套快被写烂了的编码技巧。随便找找都能找到大量的书和博客。但是基本上都是用很大的篇幅来介绍设计模式的实现、优点、缺点等等。举的一些例子也是与实际开发基本不相干的例子。基于此,我才决定写一系列设计模式的博文,不仅要把设计模式的原理讲清楚,还要结合实际,找出实际的应用案例。如哪些设计模式用在了Spring框架或MyBatis框架中,在我的职业生涯中,哪些业务场景用了哪些设计模式解决。理论结合实践学习起来才最有效。

所以我将本系列博文命名为《设计模式实践》,在后续的文章中我将结合市面上的优秀的设计模式相关的书、国内外一些博主关于设计模式的文章以及AI来全面的分析设计模式原理及其应用,同时结合今后参与的项目,不断完善案例。给大家带一套有深度的设计模式文章。

设计原则

阅读更多

工厂方法模式(Factory Method Pattern)

概述

工厂方法模式(Factory Method Pattern)是一个对象创建型模式。它提供了一种将对象的创建逻辑抽象出来的方式,使得客户端代码不需要关心具体的对象创建细节,而是通过调用工厂方法来创建对象。这种模式有助于解耦对象的创建和使用,同时也提供了扩展和定制对象创建过程的灵活性。

在工厂方法模式中,通常会定义一个抽象工厂接口,其中包含一个用于创建产品对象的抽象方法。具体的产品类需要实现这个工厂接口,并提供自己的产品创建逻辑。客户端代码通过调用工厂方法来创建所需的产品对象,而无需关心具体的产品类。

定义

Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses

定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

引用自《设计模式:可复用面向对象软件的基础》

说的更直白一点就是,定义一个工厂接口,将对象的实例化操作放到工厂的实现类中。

结构

$2DrinkDrinkFactorygetDrink(): DrinkMilkyTeaCocoDrinkFactorygetDrink(): DrinkCocaCocaDrinkFactorygetDrink(): Drink可口可乐Coco奶茶店生产MilkyTea可口可乐工厂生产Coca
阅读更多

简单工厂模式-Simple Factory Pattern

序言

简单工厂模式是一种非常常用的设计模式,但是并不属于GoF中的23种设计模式。简单设计模式有很多种实现方式。

本文我们就来讨论简单工厂模式的实现方式,以及如何借助Spring实现一个扩展性很好的简单工厂模式。

定义

  • creates objects without exposing the instantiation logic to the client.
  • refers to the newly created object through a common interface
  • 创建对象但是不想客户端暴露对象实例化的逻辑
  • 通过通用接口引用新创建的对象
阅读更多

5、接口隔离原则(Interface Segregation Principle, ISP)

定义

Clients should not be forced to depend upon interfaces that they don’t use.
客户端不应该依赖那些它不需要的接口

核心思想

记得几年前有一位很厉害的前辈说过:软件设计是什么,就是“分离关注点,消除重复”。这句话一直影响这我,而我做软件设计也是朝着这两个方向努力。而接口隔离原则最核心的就是拆分,即分离关注点。

阅读更多

4、依赖倒置原则(Dependency Inversion Principle, DIP)

定义

High-level modules should not depend on low-level modules. Both should depend on abstractions.
Abstractions should not depend on details. Details should depend on abstractions.

  • 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
  • 抽象不应该依赖于细节。细节应该依赖于抽象。

依赖倒置

简而言之就是“面向接口编程”。

阅读更多

3、里氏代换原则(Liskov Substitution Principle, LSP)

定义

里氏替换原则是Barbara Liskov[1]与1988年提出来的。原文是:

What is wanted here is something like the following substitution property: If for each object of type S there is an object of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when is substituted for then S is a subtype of T

如果对每一个类型为SS的对象O1O_1, 都有类型为TT的对象O2O_2, 使得以T定义的所有程序P在所有的对象O1O_1都代换成O2O_2时, 程序 P 的行为没有发生变化, 那么类型SS是类型TT的子类型。

另一种说法是:

Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.

所有引用基类的地方必须能透明地使用其子类的对象。

阅读更多