首页 > 其他分享 >创建者模式

创建者模式

时间:2022-12-07 18:11:36浏览次数:44  
标签:return String 创建者 创建 Builder 模式 public builder

建造者模式

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

  • 分离了部件的构造(由Builder来负责)装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。

  • 由于实现了构建和装配的解耦不同的构建器,相同的装配,也可以做出不同的对象相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

  • 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节

结构

  • 抽象建造者(Builder): 这个接口要实现复杂对象的哪些部分的创建, 并不涉及具体对象部件的创建

  • 具体建造者(ConcreteBuilder): 实现Builder接口, 完成复杂产品的各个部件的具体创建方式, 在构造过程完成后, 提供产品的实例

  • 产品类(Product): 要创建复杂的对象

  • 指挥者类(Director): 调用具体建造者来创建复杂对象的各个部分, 在指挥者中不涉及具体产品信息, 只负责保证对象各个部分完整创建或按照某种顺序创建

实例

创建共享单车

生产自行车是一个复杂的过程,它包含了车架,车座等组件的生产。而车架又有碳纤维,铝合金等材质的,车座有橡胶,真皮等材质。对于自行车的生产就可以使用建造者模式。

这里Bike是产品,包含车架,车座等组件;Builder是抽象建造者,MobikeBuilder和OfoBuilder是具体的建造者;Director是指挥者。

//自行车类
public class Bike {
    private String frame;
    private String seat;
​
    public String getFrame() {
        return frame;
    }
​
    public void setFrame(String frame) {
        this.frame = frame;
    }
​
    public String getSeat() {
        return seat;
    }
​
    public void setSeat(String seat) {
        this.seat = seat;
    }
}
​
// 抽象 builder 类
public abstract class Builder {
​
    protected Bike mBike = new Bike();
​
    public abstract void buildFrame();
    public abstract void buildSeat();
    public abstract Bike createBike();
}
​
//摩拜单车Builder类
public class MobikeBuilder extends Builder {
​
    @Override
    public void buildFrame() {
        mBike.setFrame("铝合金车架");
    }
​
    @Override
    public void buildSeat() {
        mBike.setSeat("真皮车座");
    }
​
    @Override
    public Bike createBike() {
        return mBike;
    }
}
​
//ofo单车Builder类
public class OfoBuilder extends Builder {
​
    @Override
    public void buildFrame() {
        mBike.setFrame("碳纤维车架");
    }
​
    @Override
    public void buildSeat() {
        mBike.setSeat("橡胶车座");
    }
​
    @Override
    public Bike createBike() {
        return mBike;
    }
}
​
//指挥者类
public class Director {
    private Builder mBuilder;
​
    public Director(Builder builder) {
        mBuilder = builder;
    }
​
    public Bike construct() {
        mBuilder.buildFrame();
        mBuilder.buildSeat();
        return mBuilder.createBike();
    }
}
​
//测试类
public class Client {
    public static void main(String[] args) {
        showBike(new OfoBuilder());
        showBike(new MobikeBuilder());
    }
    private static void showBike(Builder builder) {
        Director director = new Director(builder);
        Bike bike = director.construct();
        System.out.println(bike.getFrame());
        System.out.println(bike.getSeat());
    }
}

注意:

上面示例是 Builder模式的常规用法,指挥者类 Director 在建造者模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类,但是有些情况下需要简化系统结构,可以把指挥者类和抽象建造者进行结合

// 抽象 builder 类
public abstract class Builder {
​
    protected Bike mBike = new Bike();
​
    public abstract void buildFrame();
    public abstract void buildSeat();
    public abstract Bike createBike();
    
    public Bike construct() {
        this.buildFrame();
        this.BuildSeat();
        return this.createBike();
    }
}

说明:

这样做确实简化了系统结构,但同时也加重了抽象建造者类的职责,也不是太符合单一职责原则,如果construct() 过于复杂,建议还是封装到 Director 中。

优缺点

优点
  • 封装性很好, 可以有效的封装变化, 在使用建造者模式的场景中, 一般产品类和建造者类是比较稳定的, 因此, 将主要的业务逻辑封装在指挥者类中对整体而言可以取得比较好的稳定性

  • 在建造者模式中, 客户端不必知道产品内部组成的细节, 将产品本身与产品的创建过程解耦, 使得相同的创建过程可以创建不同的产品对象

  • 可以更加精细地控制产品的创建过程, 将复杂产品的创建步骤分解在不同的方法中, 使得创建过程更加清晰, 也更方便使用程序来控制创建过程

缺点

所创建的产品一般具有较多的共同点, 其组成部分相似, 如果产品间的差异很大, 则不适合使用建造者模式, 因此其适用范围收到一定限制

适用场景

创建的是复杂对象, 其产品的各个部分经常绵连者剧烈的变化, 但将他们组合在一起的算法却相对稳定, 所以它通常在以下场合下使用

  • 创建的对象比较复杂, 由多个部件构成, 各部件面临着复杂的变化, 但构件间的建造顺序是稳定的

  • 创建复杂对象的算法独立于该对象的组成部分以及他们的装配方式, 即产品的构建过程和最终的表示(对象)是独立的

!重要 : 模式扩展

建造者模式除了上面的用途外, 在开发中还有一个常用的使用方式, 就是当一个类构造器需要传入很多参数时, 如果创建这个类的实例, 代码可读性会非常差, 而且容易引入错误, 此时就可以利用建造者模式进行重构

package com.itheima.pattern.builder.demo2;
​
/**
 * @author whf
 * @version 1.0.0
 * @Date: 2022/12/7 17:18
 */
public class Phone {
​
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;
​
    /**
     * 私有构造方法
     *
     * @param builder
     */
    private Phone(Builder builder) {
        this.cpu = builder.cpu;
        this.screen = builder.screen;
        this.memory = builder.memory;
        this.memory = builder.memory;
    }
​
    /**
     * kc 内部类builder
     */
    public static final class Builder {
​
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;
​
        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }
​
        public Builder screen(String screen) {
            this.screen = screen;
            return this;
        }
​
        public Builder memory(String memory) {
            this.memory = memory;
            return this;
        }
​
        public Builder mainboard(String mainboard) {
            this.mainboard = mainboard;
            return this;
        }
​
        /**
         * 使用构建者创建手机对象
         *
         * @return
         */
        public Phone build() {
            return new Phone(this);
        }
​
    }
​
    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}
​
public class Client {
​
    public static void main(String[] args) {
        Phone phone = new Phone.Builder()
                .cpu("intel")
                .screen("huawei")
                .mainboard("华硕")
                .memory("DDR4")
                .build();
        System.out.println(phone);
    }
​
}

重构后的代码在使用起来更方便,某种程度上也可以提高开发效率。从软件设计上,对程序员的要求比较高。

标签:return,String,创建者,创建,Builder,模式,public,builder
From: https://www.cnblogs.com/phonk/p/16963890.html

相关文章

  • 为什么 egui 用立即模式?
    https://github.com/emilk/egui#why-immediate-mode 为什么立即模式egui是立即模式GUI库,与保留模式GUI库相对。保留模式和立即模式之间的区别最好用按钮的例子来说......
  • 01.单例设计模式
    单例设计模式​ 所谓单例设计模式,就是采取一定的方法在保证整个软件系统当中,对某个类只能存在一个对象实例,并且该类只提供了一个取得其对象实例的方法单例设计模式有八种......
  • 建造者模式(描述语言PHP)
    Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。 <?php/***建造者模式**将一个复杂......
  • java单例模式
    1.饿汉式2.懒汉式2.1 双重检查2.2 静态内部类2.3 枚举......
  • FastBoot BootLoader Recovery 模式学习
    概念简单介绍fastboot是一种协议,是一种通过USB连接与bootloader通讯的机制。它被设计的非常容易实现,适用于Linux、Windows或者macOS等多种平台。fastboot是Android系统提......
  • AFL(十七)qemu模式报错 util/memfd.c:40:12: error: static declaration of ‘memfd_cre
    qemu模式使用需要进入qemumode文件夹,然后运行那个sh脚本,但是会报错:util/memfd.c:40:12:error:staticdeclarationof‘memfd_create’followsnon-staticdeclarati......
  • 【每天一个java设计模式(完)】 - 四万字实现23种设计模式(附示例源码)
    什么是设计模式:​​【每天一个java设计模式(零)】-设计模式基本概念及七大设计原则​​创建型模式工厂模式:​​【每天一个java设计模式(一)】-工厂模式​​抽象工厂模式:......
  • React组件设计模式-纯组件,函数组件,高阶组件
    一、组件(1)函数组件如果你想写的组件只包含一个render方法,并且不包含state,那么使用函数组件就会更简单。我们不需要定义一个继承于React.Component的类,我们可以定......
  • 面试时如何聊单例模式
    今天有个我辅助的学员,他今天面试了软通动力Java开发工程,他期望薪资是18k。面试他的正是甲方华为公司。其中面试官要他说说他自己熟悉的设计模式。然后他巴拉巴拉,说了单例模......
  • 设计模式-引言
    设计模式的重要性在软件工程当中,设计模式是对软件设计普遍存在的各种问题,所提出的解决方案,这个术语由埃里希·伽玛等人在1990年从设计领域引入到计算机科学的拿实际工......