设计模式 建造者模式介绍、案例应用、建造者模式和工厂模式的区别

目录

1 建造者模式介绍

2 示例和代码

3 适用范围

4 建造者模式和工厂模式的区别


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 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值