o2o网站运维建设方案,微信app下载安装官方版平板,住房和城乡建设部注册中心,网络设计网站建设类网站模板系列文章目录
肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 文章目录 系列文章目录前言一、什么是建造者模式二、举个栗子三、静态内部类写法四、开源框…系列文章目录
肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 文章目录 系列文章目录前言一、什么是建造者模式二、举个栗子三、静态内部类写法四、开源框架中的应用写在最后 前言
前文中我们知道设计模式可以分为三大类创建型模式、结构型模式、行为型模式。创建型模式中有5种前几节里我们分析了单例模式、工厂方法模式、抽象工厂模式、原型模式那么创建型模式还有最后一种模式建造者模式这一节中我们来分析一下建造者模式。 一、什么是建造者模式
建造者模式(Builder Pattern)将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的对象。 可以这么理解对象的构建与它的表示分离就是创建一个对象的实例和成员变量的赋值相分离。建造者模式使用多个简单的对象一步一步构建成一个复杂的对象这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。
二、举个栗子
以制作一本儿童绘本为例默默拿起手边的《白雪公主》┐(・o・)┌ 通常绘本由封面、标题、内容、插图、页码来组成这些内容的组成顺序可以随意调整我们用建造者模式来模拟一下制作绘本的过程。
写在代码
Data
public class Book {private String cover;private String title;private String content;private String pic;private Integer pageNo;Overridepublic String toString() {return Book{ cover cover \ , title title \ , content content \ , pic pic \ , pageNo pageNo \ };}
}
然后再建一个建造者类封装创建过程由使用者根据需要来调用
public class BookBuilder {private Book book new Book();public BookBuilder addCover(String cover){book.setCover(cover);return this;}public BookBuilder addTitle(String title){book.setTitle(title);return this;}public BookBuilder addContent(String content){book.setContent(content);return this;}public BookBuilder addPic(String pic){book.setPic(pic);return this;}public BookBuilder addPageNo(Integer pageNo){book.setPageNo(pageNo);return this;}public Book build(){return book;}
}测试一下
public static void main(String[] args) {BookBuilder builder new BookBuilder().addCover(漂亮的封面).addTitle(《白雪公主》).addContent(美丽善良的公主被恶毒的皇后嫉妒被迫逃亡最终被七个小矮人救助。).addPic(漂亮的插图).addPageNo(30);System.out.println(builder.build());
}是不是有点熟悉像不像MyBatis Plus中QueryWrapper的写法后文我们在开源框架的应用中来具体说一说。
三、静态内部类写法
通常我们更习惯使用静态内部类的方式实现建造者模式由它负责产品的组装创建不再需要Builder和Director这样的话代码结构更加紧凑创建过程与产品的属性联系更加紧密同时使得建造者模式的形式更加简洁。
然后我们来修改下代码
Data
public class Book {private String cover;private String title;private String content;private String pic;private Integer pageNo;Overridepublic String toString() {return Book{ cover cover \ , title title \ , content content \ , pic pic \ , pageNo pageNo \ };}public static class Builder {private Book book new Book();public BookBuilder addCover(String cover){book.setCover(cover);return this;}public BookBuilder addTitle(String title){book.setTitle(title);return this;}public BookBuilder addContent(String content){book.setContent(content);return this;}public BookBuilder addPic(String pic){book.setPic(pic);return this;}public BookBuilder addPageNo(Integer pageNo){book.setPageNo(pageNo);return this;}public Book build(){return book;}}
}测试一下
public static void main(String[] args) {Book book new Book.Builder().addCover(漂亮的封面).addTitle(《白雪公主》).addContent(美丽善良的公主被恶毒的皇后嫉妒被迫逃亡最终被七个小矮人救助。).addPic(漂亮的插图).addPageNo(30).build();System.out.println(book);
}是不是简洁和优雅多了(〃‘▽’〃)
四、开源框架中的应用
刚刚在写样例的时候有的同学可能已经发现这种链式写法很像MyBatis Plus的QueryWrapper写法那么就结合MyBatis Plus这个开源持久层框架的源码简单来说一说MyBatis Plus是如何基于建造者模式的思想提供一套流畅的API来构建查询条件的。
由于实际MyBatis Plus源码是很复杂的我们拿一个简化版的来举例
public class QueryWrapperT {private ListString conditions;public QueryWrapperT eq(String column, Object value) {conditions.add(column value);return this;}public QueryWrapperT ne(String column, Object value) {conditions.add(column ! value);return this;}public QueryWrapperT gt(String column, Object value) {conditions.add(column value);return this;}// 其他条件方法...public ListT selectList() {// 根据conditions构建查询语句并执行查询}
}在这个样例中QueryWrapper类定义了一系列方法例如eq、ne、gt等用于设置不同的查询条件。每个条件方法都返回QueryWrapper对象本身以便实现链式调用。这里的关键点是在每个条件方法中都将新的条件添加到conditions列表中并返回当前对象的引用。
这样我们就可以使用链式调用的方式在一个语句中设置多个查询条件
QueryWrapperUser queryWrapper new QueryWrapper();
queryWrapper.eq(name, John).ne(age, 30).gt(salary, 5000);这种设计提高了代码的可读性和可维护性使得构建复杂查询条件变得更加直观和简洁。 写在最后
建造者模式的使用场景
适用于创建复杂对象并通过一步步构建对象的方式来隐藏对象构建的细节。
建造者模式的优点
建造者独立易扩展。建造过程可控便于控制细节风险。提高代码复用性
建造者模式的缺点
增加了代码复杂性不易于理解。对象构建过程固定不够灵活。