23种设计模式-java-生成器

这篇博客介绍了生成器模式的应用,通过示例展示了如何使用生成器避免长构造函数问题,以及在创建不同形态产品时的灵活性。还提到了在特定业务场景下,可以引入主管概念来固化某些维度的创建过程,提高代码复用性和简洁性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式概述:

使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

使用场景:

  1. 使用生成器模式可避免 “重叠构造函数 (telescopic constructor)” 的出现。
  2. 当你希望使用代码创建不同形式的产品 (例如石头或木头房屋) 时, 可使用生成器模式。
  3. 使用生成器构造组合树或其他复杂对象。

代码样例:

代码背景: 假设你要创建一个Person对象,该对象有几十上百的属性,但你的意愿创建的对象可能并不需要其中的很多属性,构造函数会传入很多null;对于构造函数的调用十分不简洁;使用生成器进行创建Persion。

/**
 * 人(复杂对象)
 */
public class Person {
    private String name;
    private int age;
    private double weight;
    private double height;
    private String idCard;
    private String address;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", weight=" + weight +
                ", height=" + height +
                ", idCard='" + idCard + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

	/**
     * Person生成器
     */
    public static class PersonBulider{
        Person p = new Person();

        /**
         * 基础(必要)属性赋值
         */
        public PersonBulider baseInfo(String name,int age){
            p.name = name;
            p.age = age;
            return this;
        }

        /**
         * 体重属性赋值
         */
        public PersonBulider weight(double weight){
            p.weight = weight;
            return  this;
        }

        /**
         * 身高属性赋值
         */
        public PersonBulider height(double height){
            p.height = height;
            return  this;
        }

        /**
         * 身份证属性赋值
         */
        public PersonBulider idCard(String idCard){
            p.idCard = idCard;
            return  this;
        }

        /**
         * 身份证属性赋值
         */
        public PersonBulider address(String address){
            p.address = address;
            return  this;
        }

        public Person bulider(){
            return  p;
        }

    }

}
public class TestBuilder {
    public static void main(String[] args) {
        Person person = new Person.PersonBulider()
                .baseInfo("张三",19)
                .height(180)
                .weight(135)
                .bulider();

        System.out.println(person.toString());
    }
}

测试结果:
在这里插入图片描述

补充:
生成器中还有一个”主管“的概念;比如一个品牌汽车进行生产汽车,汽车的型号是固定的几种(汽车型号是一种维度,也可以是其他维度),每种型号的汽车的零件是一致的,换句话说,就是每种型号的汽车构件是固定的(固化的);那么可以创建一个主管类,里面提供各个型号汽车的生产方法,每个型号的生产方法内部是固定当前型号汽车的汽车零件,调用builder的方法进行生产当前型号的汽车;这样的话就不需要在客户端多次给汽车builder属性了,直接调用主管的对应型号的汽车生产方法即可。上面提供的代码样例是动态的,每个对象都是自定义的;类比汽车也可以选择一个维度让Person的创建交给主管执行,比如选择相貌维度(有帅哥、美女、丑八怪等),主管中生成帅哥的代码中,身高都是185,体重都是135等。具体使用自定义还是固化(主管)需要根据业务场景实际选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值