常说的设计模式是23种设计模式,分为3大类:
创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型
结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合
行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。
上次咱们说了“单例模式”及适用情况。今天来说“建造者模式”。
建造者模式是通过一步一步的步骤构建一个包含多个部件的对象,每个不同的对象都是具有相同的构建过程。适用于复杂对象的构建,用户不需要知道具体的构建细节,只需要指定对象的类型即可。建造者模式将对象的构建和装配进行了解耦,可以使用不同的构建器,相同的装配过程构造出不同的对象。
场景
适用于一个复杂的对象,这个对象是由多个对象或者简单的属性组合而成,再通过稳定的一系列构造步骤一步步的构造出来。
主要内容
抽象的建造者类(Builder): 为创建一个复杂对象的各个部件指定抽象的接口,但是不实现这些具体部件的创建,每个具体部件的创建由具体的建造者来完成。
具体的建造者类(ConcreteBuilder): 实现上方的Builder接口,并且实现抽象接口里面每个部件的具体的实现,在部件全部构造完成后也会提供一个返回这个复杂对象的方法。
Director: 构造一个使用了Builder接口的具体的对象,它会调用具体的建造者类来创建具体的复杂对象每个部件,最后返回这个对象。Director里面不涉及具体的对象的任何信息,只包装这个复杂对象的各个部件的正确创建并且按照一定的构建顺序构建。
Product: 需要被构造的复杂对象。
“建造者模式”主要以建造出产品为主,针对“产品的产生由各个组成部分实现而建造”。例如产品人类:人的组成部分设置为头、身体、手、脚。
要先建造各个部分,所以要设立接口建造各个部分的抽象方法。为了能在组建产品之前把各个组成部分的设定(或实现)完成。最终为了一个目标——组建成人。
要实现其抽象方法,也就是实现各个组成部分的具体内容。
然后,创建出建造整体产品人的“引导类”。也就是说,要在“引导类”的组建方法中编写出构建人的行为。包括创建头、身、手、脚的设定。当然是通过传入建造各个部分的接口来完成。
在应用的时候:
通过引导类“Director”的builderHuman方法创建出完整的产品人类。各个组成部分是当前建造方法(builderHuman)的参数,也就是实现产品人类的必要条件。
具体什么时候应用呢?
其实可以观察到,当要创建某一个对象的时候,发现对象的类结构规划由多个组成部分组合而成,那就要考虑先实现各个部分的内容设定再完成构建对象。类似这种情况,就可以考虑用“建造者模式”来完成。
建造者模式包含的角色:
1、产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
2、抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getProduct()。
3、具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
4、指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建。其中包含一个负责组装的方法void makeProduct(Builder builder),在这个方法中通过调用builder的方法,就可以设置builder,等设置完成后,就可以通过builder的 getProduct() 方法获得最终的产品。
特点
1、它将一个复杂的对象分解为多个简单的对象,然后分别构建这些个简单对象,最后再组合成我们需要的对象。
2、它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式的优点
易于解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品,也就说细节依赖于抽象。
易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
易于拓展
增加新的具体建造者无需修改原有类库的代码,只需再增加一个具体建造者即可,易于拓展,符合“开闭原则”。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
建造者模式的缺点
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
以上就是今日分享,如果你觉得有用记的点赞收藏哦,以防找不到我~