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


    目录

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

  • 相关阅读:
    设计模式:快照模式
    Python基本语法(3)开数组
    Linux各种命令-查询篇
    维格云单点登录SSO入门教程
    [附源码]计算机毕业设计springboot病人跟踪治疗信息管理系统
    Python 和 Selenium 的浏览器爬虫
    AXI总线基础知识学习记录1
    原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列4
    【C#】类型转换-显式转换:括号强转、Parse法、Convert法、其他类型转string
    【C++ Primer Plus学习记录】第4章编程练习
  • 原文地址:https://blog.csdn.net/m0_45877477/article/details/126754227