建造者模式(Builder Pattern)
属于建立型模式
的一种,将多个简单对象构建成一个复杂的对象,构建过程抽象化,不一样实现方法能够构造出不一样表现(属性)的对象,还提供了一种更加优雅构建对象的方式...git
有时候构建一个复杂的对象,须要通过好几步的处理,好比经常使用的StringBuffer、StringBuilder、以及Swagger(一种接口文档)
,都是以这种模式构建对象的程序员
优势github
建造者模式
比较独立,将对象自己与构建过程解耦缺点函数
适用场景ui
相关模式this
抽象工厂模式与建造者模式类似
,由于它也能够建立复杂对象。主要的区别是建造者模式
着重于一步步得构造出复杂对象。而抽象工厂模式
着重于多个系列的产品对象(简单的或是复杂的)。建造者
是在最后的一步返回对象,而对于抽象工厂来讲,对象是当即返回的。插件
传统方式code
public class Summoner { private String name; private String type; private String innate; public Summoner(String name, String type, String innate) { this.name = name; this.type = type; this.innate = innate; } }
简单的对象咱们可使用下面这种方式,由于属性较少这种方式还看的,但不幸的是若是要增长字段或咱们还须要去扩展构造方法,且可读性
很差,相同类型的状况下在必定程度上混淆视听了对象
Summoner s1 = new Summoner("德玛","战士","战争雷霆");
为何不调用无参数的构造函数,经过
setter
方法来减轻问题。接口
解答: 若是程序员忘记调用一个特定的setter
方法会发生什么?咱们可能获得的是一个部分初始化的对象,并且编译器也不会检测出任何问题。
使用模式
在咱们的示例中,改造下召唤师类
public class Summoner { private String name; private String type; private String innate; private Summoner(Builder builder) { this.name = builder.name; this.type = builder.type; this.innate = builder.innate; } protected static class Builder { private String name; private String type; private String innate; protected Builder name(String name) { this.name = name; return this; } protected Builder type(String type) { this.type = type; return this; } protected Builder innate(String innate) { this.innate = innate; return this; } protected Summoner build() { return new Summoner(this); } } } public class BuilderDemo { public static void main(String\[\] args) { Summoner monkey = new Summoner.Builder().name("齐天大圣 - 孙悟空").type("上单 - AD").innate("基石天赋 - 战争雷霆").build(); System.out.println(monkey.toString()); Summoner mouse = new Summoner.Builder().name("瘟疫之源 - 图奇").type("下路 - ADC").innate("基石天赋 - 战阵热诚").build(); System.out.println(mouse.toString()); Summoner diann = new Summoner.Builder().name("皎月女神 - 戴安娜").type("中单 - AP").build(); System.out.println(diann.toString()); } }
建造者模式
让咱们写的代码更具可读性,可理解为创建复杂的物体。它每每是实现一个连贯的操做,从而更加直观,此处因为类型较为单一差距不大,但遇到复杂对象构建差距就立竿见影了
Summoner{name='齐天大圣 - 孙悟空', type='上单 - AD', innate='基石天赋 - 战争雷霆'} Summoner{name='瘟疫之源 - 图奇', type='下路 - ADC', innate='基石天赋 - 战阵热诚'} Summoner{name='皎月女神 - 戴安娜', type='中单 - AP', innate='null'}
咱们经过一个简单的代码例子开始,慢慢变得复杂。而后使用Builder模式
来解决咱们发现的问题。
若是你发现本身在一个状况下,你不断添加新参数的构造函数,使得代码变得容易出错,很难读,也许能够考虑使用一个Builder
重构你的代码。
全文代码:https://gitee.com/battcn/design-pattern/tree/master/Chapter4/battcn-builder