设计模式-3.4生成器模式
生成器模式
定义
-
定义:封装一个复杂对象构造过程,并允许按步骤构造。
-
定义解释: 我们可以将生成器模式理解为,假设我们有一个对象需要建立,这个对象是由多个组件(Component)组合而成,每个组件的建立都比较复杂,但运用组件来建立所需的对象非常简单,所以我们就可以将构建复杂组件的步骤与运用组件构建对象分离,使用builder模式可以建立。
结构
-
(1)产品(Product):具体生产器要构造的复杂对象;
-
(2)抽象生成器(Bulider):抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义了若干个方法之外,还要定义返回Product对象的方法(定义构造步骤);
-
(3)具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法(生产各个组件);
-
(4)指挥者(Director):指挥者是一个类,该类需要含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器,即指挥者将请求具体生成器类来构造用户所需要的Product对象,如果所请求的具体生成器成功地构造出Product对象,指挥者就可以让该具体生产器返回所构造的Product对象。(按照步骤组装部件,并返回Product)
优缺点
- 优点
- 将一个对象分解为各个组件
- 将对象组件的构造封装起来
- 可以控制整个对象的生成过程
- 缺点
对不同类型的对象需要实现不同的具体构造器的类,这可能回答大大增加类的数量
使用场景
建造者 (Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定,所以它通常在以下场合使用。
- 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
- 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
生成器模式与工厂模式的不同
生成器模式构建对象的时候,对象通常构建的过程中需要多个步骤,就像我们例子中的先有主机,再有显示屏,再有鼠标等等,生成器模式的作用就是将这些复杂的构建过程封装起来。工厂模式构建对象的时候通常就只有一个步骤,调用一个工厂方法就可以生成一个对象
- 工厂方法模式VS建造者模式
-
- 工厂方法模式注重的是整体对象的创建方式,而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是个力大无穷、能够飞翔、内裤外穿的超人,而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。
- 抽象工厂模式VS建造者模式
-
- 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品: 具有不同分类维度的产品组合采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工通过对部件的组装可以返回一辆完整的汽车。
代码示例
静态内部类Builder
package com.study.notes.design.patterns.pattern.create.builder.demo2;/*** @version v1.0* @ClassName: Phone* @Description: 手机类* @Author: lzq*/
public class Phone {private String cpu;private String screen;private String memory;private String mainboard;//私有构造方法private Phone(Builder builder) {this.cpu = builder.cpu;this.screen = builder.screen;this.memory = builder.memory;this.mainboard = builder.mainboard;}@Overridepublic String toString() {return "Phone{" +"cpu='" + cpu + '\'' +", screen='" + screen + '\'' +", memory='" + memory + '\'' +", mainboard='" + mainboard + '\'' +'}';}public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder cpu(String cpu) {this.cpu = cpu;return this;}public Builder screen(String screen) {this.screen = screen;return this;}public Builder memory(String memory) {this.memory = memory;return this;}public Builder mainboard(String mainboard) {this.mainboard = mainboard;return this;}//使用构建者创建Phone对象public Phone build() {return new Phone(this);}}
}
package com.study.notes.design.patterns.pattern.create.builder.demo2;import com.study.notes.bean.Author;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句话描述该类的功能)* @Author: lzq*/
public class Client {public static void main(String[] args) {//创建手机对象 通过构建者对象获取手机对象Phone phone = new Phone.Builder().cpu("intel").screen("三星屏幕").memory("金士顿内存条").mainboard("华硕主板").build();System.out.println(phone);// 对比下lombok的builderAuthor author = Author.builder().name("lzq").age(22).build();System.out.println(author);}
}
组装型Builder
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: Bike* @Description: 产品对象* @Author: lzq*/
public class Bike {private String frame;//车架private String seat;//车座public String getFrame() {return frame;}public void setFrame(String frame) {this.frame = frame;}public String getSeat() {return seat;}public void setSeat(String seat) {this.seat = seat;}
}
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: Builder* @Description: TODO(一句话描述该类的功能)* @Author: lzq*/
public abstract class Builder {//声明Bike类型的变量,并进行赋值protected Bike bike = new Bike();public abstract void buildFrame();public abstract void buildSeat();//构建自行车的方法public abstract Bike createBike();
}
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: MobileBuilder* @Description: 具体的构建者,用来构建摩拜单车对象* @Author: lzq*/
public class MobileBuilder extends Builder {public void buildFrame() {bike.setFrame("碳纤维车架");}public void buildSeat() {bike.setSeat("真皮车座");}public Bike createBike() {return bike;}
}
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: OfoBuilder* @Description: ofo单车构建者,用来构建ofo单车* @Author: lzq*/
public class OfoBuilder extends Builder {public void buildFrame() {bike.setFrame("铝合金车架");}public void buildSeat() {bike.setSeat("橡胶车座");}public Bike createBike() {return bike;}
}
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: Director* @Description: 指挥者类* @Author: lzq*/
public class Director {//声明builder类型的变量private Builder builder;public Director(Builder builder) {this.builder = builder;}//组装自行车的功能public Bike construct() {builder.buildFrame();builder.buildSeat();return builder.createBike();}
}
package com.study.notes.design.patterns.pattern.create.builder.demo1;/*** @version v1.0* @ClassName: Client* @Description: TODO(一句话描述该类的功能)* @Author: lzq*/
public class Client {public static void main(String[] args) {//创建指挥者对象Director director = new Director(new MobileBuilder());//让指挥者只会组装自行车Bike bike = director.construct();System.out.println(bike.getFrame());System.out.println(bike.getSeat());}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
