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


    目录

    1 建造者模式介绍

    2 示例和代码

    3 适用范围

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


    1 建造者模式介绍

    又叫做创建者模式

    属于创建型模式

    将一个复杂对象,分解为多个简单对象,然后一步步地组装出来。

    将变与不变相分离(即产品的组成部分是不变的,但每一部分是可以灵活选择的)。

    建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

     主要优点:

    1 封装性好,构建和表示分离。


    2 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。


    3 客户端不必知道产品组成的细节,建造者可以对创建过程逐步细化,而不对其他模式产生任何影响,便于控制细节风险。

    缺点:

    1 产品的组成部分必须相同, 这限制了其使用范围。


    2 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。


    建造者模式由产品、抽象建造者、具体建造者、指挥者4个要素构成。


    1 产品角色 product:包含多个组成部分的复杂对象,由具体建造者来创建其各个零部件。


    2 抽象建造者 builder:是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。


    3 具体建造者Concrete Builder:实现builder接口,完成复杂产品的各个部件的具体建造方法。


    4 指挥者director:调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

    2 示例和代码

    比如,我们每个人都有不同的长相,人是一个产品。

    每个人都长了眼睛、鼻子、嘴巴。

    每个人的眼睛、鼻子、嘴巴特点不同,组成的人就是不同的。

    代码:

    人——产品

    1. package com.qing.constructor;
    2. public class Person {
    3. private String eye;
    4. private String nose;
    5. private String mouth;
    6. public void setEye(String eye) {
    7. this.eye = eye;
    8. }
    9. public void setNose(String nose) {
    10. this.nose = nose;
    11. }
    12. public void setMouth(String mouth) {
    13. this.mouth = mouth;
    14. }
    15. public void show(){
    16. System.out.println("一个"+eye+" "+nose+" "+mouth+"的人");
    17. }
    18. }

    上帝——抽象建造者

    1. package com.qing.constructor;
    2. public abstract class God {
    3. Person person = new Person();
    4. public abstract void installEye();
    5. public abstract void installNose();
    6. public abstract void installMouth();
    7. public Person getResult(){
    8. return person;
    9. }
    10. }

     具体建造者1

    1. package com.qing.constructor;
    2. public class Parent1 extends God{
    3. @Override
    4. public void installEye() {
    5. person.setEye("大眼睛、双眼皮");
    6. }
    7. @Override
    8. public void installNose() {
    9. person.setNose("高鼻梁");
    10. }
    11. @Override
    12. public void installMouth() {
    13. person.setMouth("樱桃小嘴");
    14. }
    15. }

     具体建造者2

    1. package com.qing.constructor;
    2. public class Parent2 extends God {
    3. @Override
    4. public void installEye() {
    5. person.setEye("小眼睛、单眼皮");
    6. }
    7. @Override
    8. public void installNose() {
    9. person.setNose("大鼻子");
    10. }
    11. @Override
    12. public void installMouth() {
    13. person.setMouth("大嘴巴");
    14. }
    15. }

    指挥者

    1. package com.qing.constructor;
    2. public class Director {
    3. private God god;
    4. public Director(God god) {
    5. this.god = god;
    6. }
    7. public Person install(){
    8. god.installEye();
    9. god.installNose();
    10. god.installMouth();
    11. return god.getResult();
    12. }
    13. }

    测试

    1. package com.qing.constructor;
    2. public class Test1 {
    3. public static void main(String[] args) {
    4. God parent1 = new Parent1();
    5. Director director1 = new Director(parent1);
    6. director1.install().show();
    7. System.out.println("----------------------");
    8. God parent2 = new Parent2();
    9. Director director2 = new Director(parent2);
    10. director2.install().show();
    11. }
    12. }

    结果

     

    3 适用范围

    建造者模式适用于以下应用场景:

    1 相同的方法,不同的执行顺序,产生不同的结果。


    2 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。


    3 产品类非常复杂,或者产品类中,不同的调用顺序,产生不同的结果。


    4 初始化一个对象特别复杂,参数,而且很多参数都有默认值。

     

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

    1 建造者模式和工厂模式的关注点不同。工厂模式只需要把对象创建出来就可以了,而建造者模式,不仅要创建出对象,还要知道对象由哪些部分组成。


    2 建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。


    3 创建简单对象,通常使用工厂模式;创建复杂对象,可以考虑使用建造者模式。


    4 建造者模式根据建造过程中的顺序不一样,最终对象部件组成也不一样。

  • 相关阅读:
    杰理之如何测试按键的误触率【篇】
    使用SqlBulkCopy,报错“从bcp客户端收到一个对colid 4无效的列长度”
    ubuntu22.04.2安装onlyoffice(不更改默认端口版)
    K8s----资源管理
    工作中出现什么「迹象」,表明你应该换工作了?
    JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)
    71.【MySQL-二刷】
    Javascript知识【jQuery:数组遍历和事件】
    Nginx:移植Nginx内存池 | 附测试用例
    一、数据库的基础简介
  • 原文地址:https://blog.csdn.net/m0_45877477/article/details/126754227