一、前言 今天我们讨论一下 Builder 建造者模式,这个 Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这
1. 创建父类和子类 首先,我们需要创建一个父类Person和一个子类Employee。 // 父类:PersonpublicclassPerson{privateStringname;privateintage;// 构造函数publicPerson(Stringname,intage){this.name=name;this.age=age;}// Getter 方法publicStringgetName(){returnname;}publicintgetAge(){returnage;}}// 子类...
1. 定义父类Vehicle publicclassVehicle{privateStringbrand;privateStringmodel;protectedVehicle(Builder<?>builder){this.brand=builder.brand;this.model=builder.model;}publicstaticabstractclassBuilder<TextendsBuilder<T>>{privateStringbrand;privateStringmodel;publicTwithBrand(Stringbrand){this.brand=brand;returnsel...
建造者的父类Builder中的代码: publicabstractclassBuilder {protectedProduct product;publicabstractProduct buildProduct(); } Builder的子类ProductBuilder1中的代码: publicclassProductBuilder1 extendsBuilder { @OverridepublicProduct buildProduct() {super.product =newProduct();super.product.addComponent(newPartA()...
设计模式:Builder模式 一、前言 今天我们讨论一下Builder建造者模式,这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理,而是用另
对象继承后,子类的 Builder 因为构造函数的问题,使用不当大概率会报错,并且无法设置父类的属性,还需要使用 @SuperBuilder 来解决问题。 (6)设置默认值需要使用 @Builder.Default。很容易因为对此不了解,导致默认值不符合预期导致出现 BUG。 三、怎么做?
3、里氏替换原则。使用基类的地方都可以用子类替换,而不影响功能;也就是要做到子类可以扩展父类的功能,但是不能改变父类原有的功能。 4、依赖倒置原则。高层模块不应该依赖于低层模块,而是应该依赖于抽象。换句话说,具体实现应该依赖于抽象,而不是抽象依赖于具体实现; ...
给BaseDTO上加上Builder注解也不会有任何效果。事实上,Builder注解只管承接注解的这个类,而不会管他的父类或者子类。如果真的是这样的话,遇到有继承的类,只好又打回原形,写一堆的setter方法了。试试SuperBuilder吧 这个问题在lombokv1.18.2版本之前其实很难办,但是在这个版本官方引入了一个新的注解@Super...
对象继承后,子类的 Builder 因为构造函数的问题,使用不当大概率会报错,并且无法设置父类的属性,还需要使用 @SuperBuilder 来解决问题。 (6)设置默认值需要使用 @Builder.Default。很容易因为对此不了解,导致默认值不符合预期导致出现 BUG。 三、怎么做?
按照官方文档的说法,为了能够使用build方法,只需要在子类和父类上都加@SuperBuilder注解,我们试一下 果然现在就可以在子类的实例中build`父类的成员变量了 Lombok的原理 Lombok自动生成代码的实现也是依赖于JVM开放的扩展点,使其可以在编译的时候修改抽象语法树,从而影响最终生成的字节码 ...