目录
1 建造者模式介绍
又叫做创建者模式
属于创建型模式
将一个复杂对象,分解为多个简单对象,然后一步步地组装出来。
将变与不变相分离(即产品的组成部分是不变的,但每一部分是可以灵活选择的)。
建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
主要优点:
1 封装性好,构建和表示分离。
2 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
3 客户端不必知道产品组成的细节,建造者可以对创建过程逐步细化,而不对其他模式产生任何影响,便于控制细节风险。
缺点:
1 产品的组成部分必须相同, 这限制了其使用范围。
2 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
建造者模式由产品、抽象建造者、具体建造者、指挥者4个要素构成。
1 产品角色 product:包含多个组成部分的复杂对象,由具体建造者来创建其各个零部件。
2 抽象建造者 builder:是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
3 具体建造者Concrete Builder:实现builder接口,完成复杂产品的各个部件的具体建造方法。
4 指挥者director:调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
2 示例和代码
比如,我们每个人都有不同的长相,人是一个产品。
每个人都长了眼睛、鼻子、嘴巴。
每个人的眼睛、鼻子、嘴巴特点不同,组成的人就是不同的。
代码:
人——产品
package com.qing.constructor;
public class Person {
private String eye;
private String nose;
private String mouth;
public void setEye(String eye) {
this.eye = eye;
}
public void setNose(String nose) {
this.nose = nose;
}
public void setMouth(String mouth) {
this.mouth = mouth;
}
public void show(){
System.out.println("一个"+eye+" "+nose+" "+mouth+"的人");
}
}
上帝——抽象建造者
package com.qing.constructor;
public abstract class God {
Person person = new Person();
public abstract void installEye();
public abstract void installNose();
public abstract void installMouth();
public Person getResult(){
return person;
}
}
具体建造者1
package com.qing.constructor;
public class Parent1 extends God{
@Override
public void installEye() {
person.setEye("大眼睛、双眼皮");
}
@Override
public void installNose() {
person.setNose("高鼻梁");
}
@Override
public void installMouth() {
person.setMouth("樱桃小嘴");
}
}
具体建造者2
package com.qing.constructor;
public class Parent2 extends God {
@Override
public void installEye() {
person.setEye("小眼睛、单眼皮");
}
@Override
public void installNose() {
person.setNose("大鼻子");
}
@Override
public void installMouth() {
person.setMouth("大嘴巴");
}
}
指挥者
package com.qing.constructor;
public class Director {
private God god;
public Director(God god) {
this.god = god;
}
public Person install(){
god.installEye();
god.installNose();
god.installMouth();
return god.getResult();
}
}
测试
package com.qing.constructor;
public class Test1 {
public static void main(String[] args) {
God parent1 = new Parent1();
Director director1 = new Director(parent1);
director1.install().show();
System.out.println("----------------------");
God parent2 = new Parent2();
Director director2 = new Director(parent2);
director2.install().show();
}
}
结果
3 适用范围
建造者模式适用于以下应用场景:
1 相同的方法,不同的执行顺序,产生不同的结果。
2 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
3 产品类非常复杂,或者产品类中,不同的调用顺序,产生不同的结果。
4 初始化一个对象特别复杂,参数,而且很多参数都有默认值。
4 建造者模式和工厂模式的区别
1 建造者模式和工厂模式的关注点不同。工厂模式只需要把对象创建出来就可以了,而建造者模式,不仅要创建出对象,还要知道对象由哪些部分组成。
2 建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
3 创建简单对象,通常使用工厂模式;创建复杂对象,可以考虑使用建造者模式。
4 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。