Builder模式创建实例

在java中实例化一个类的对象一般有三种模式,重叠构造器模式,javabean模式,builder模式。

重叠构造器模式

public class NutritionFacts {

    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public NutritionFacts(int servingSize, int servings) {
        this(servingSize, servings, 0);
    }

    public NutritionFacts(int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat) {
        this(servingSize, servings, calories, fat, 0);
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
        this(servingSize, servings, calories, fat, sodium, 0);
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        this.sodium = sodium;
        this.carbohydrate = carbohydrate;
    }
}

这种方式在有大量参数的时候代码会变得很不直观,代码可读性太差。

javabean模式

就是给定一个默认构造器,然后对所有属性提供setter,getter方法。
实例化与属性赋值在不同语句中,所以此种模式线程不安全

Builder模式

public class NutritionFacts {

    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder {

        private final int servingSize;
        private final int servings;

        private int calories = 0;
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }
    
        public Builder calories(int val){
            this.calories = val;
            return this;
        }

        public Builder fat(int val){
            this.fat = val;
            return this;
        }

        public Builder sodium(int val){
            this.sodium = val;
            return this;
        }

        public Builder carbohydrate(int val){
            this.carbohydrate = val;
            return this;
        }

    }

    public NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

使用方法:

NutritionFacts.Builder builder = new NutritionFacts.Builder(2, 3)
            .calories(1)
            .carbohydrate(2)
            .fat(4)
            .sodium(3);
NutritionFacts nutritionFacts = builder.build();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,131评论 19 139
  • 1 场景问题# 1.1 继续导出数据的应用框架## 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架。 对于...
    七寸知架构阅读 5,910评论 1 64
  • 在查看laravel源码的时候,看到有如下一段代码: 当时就有点困惑,然后在tinker连就敲了一下验证,结果陷入...
    zshanjun阅读 1,972评论 0 0
  • 我家在农村,筹备了很久,终于决定在今年将旧房推倒盖新房。我爸妈因为每平方便宜十几块钱,找了当地一个包工头。结果从年...
    stellarliuxing阅读 426评论 0 0
  • 我在抗拒 当我有了 应不应该 我在纠结 当我害怕 你不认同 我在恐惧 当我担心 你放弃我 我在怨恨 当我不想 负上...
    零距离_b1a3阅读 182评论 4 4