设计模式(三):生成器模式 (2)

设计模式(三):生成器模式

两个业务创建User对象的步骤是不一样的,这时候不适合使用生成器模式

如果所有的调用者需要的对象完全一样,也不需要使用生成器模式。

假如小姐姐的需求中,两个业务关注的消费数据都是近一个月的,对消费数据和商品数据的关注度也是一样的,就不需要使用生成器模式,只需要把User对象的创建过程进行单独的封装,两个业务直接调用即可

生成器模式实战

我们先来看一下生成器模式的架构

设计模式(三):生成器模式

套用到我们需求中,User对象的创建就是下面这个样子

设计模式(三):生成器模式

下面使用代码实现小姐姐的需求,首先定义我们要创建的对象,也就是 User 类

public class User {
    private String nickname;
    private int payCnt;
    private int payAmt;
    private List<String> productType;
    private List<String> amtInterval;

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void setPayCnt(int payCnt) {
        this.payCnt = payCnt;
    }

    public void setPayAmt(int payAmt) {
        this.payAmt = payAmt;
    }

    public void setProductType(List<String> productType) {
        this.productType = productType;
    }

    public void setAmtInterval(List<String> amtInterval) {
        this.amtInterval = amtInterval;
    }
}

第二步,编写构造接口定义创建 User 对象需要的步骤,并提供返回 User 对象的方法

public interface IUserBuilder {
    // 构建用户昵称
    String buildNicaname();
    // 构建用户消费次数,days代表最近天数
    int buildPayCnt();
    // 构建用户消费金额,days代表最近天数
    int buildPayAmt();
    // 构建用户经常浏览商品类型
    List<String> buildProductType();
    // 构建用户经常浏览商品价格区间
    List<String> buildAmtInterval();
    // 获取user对象
    User getUser();
}

第三步,编写构造接口的具体实现类,重写每一个方法,编写每一个方法的具体实现逻辑。

public class UserBuilder implements IUserBuilder {

    private String days;

    public UserBuilder(String days) {
        this.days = days;
    }

    @Override
    public String buildNicaname() {
        String nicaname = "赫连小伍";
        System.out.println("查询用户昵称为:" + nicaname);
        return nicaname;
    }

    @Override
    public int buildPayCnt() {
        int payCnt = 0;
        if ("30".equals(days)) {
            payCnt = 1;
        } else{
            payCnt = 10;
        }
        System.out.println("查询用户近" + days + "天的消费笔数为:" + payCnt);
        return payCnt;
    }

    @Override
    public int buildPayAmt() {
        int payAmt = 0;
        if ("30".equals(days)) {
            payAmt = 2;
        } else{
            payAmt = 100;
        }
        System.out.println("查询用户近" + days + "天的消费金额为:" + payAmt);
        return payAmt;
    }

    @Override
    public List<String> buildProductType() {
        List<String> list = new ArrayList<>();
        list.add("增发剂");
        list.add("格子衫");
        System.out.println("查询用户浏览的商品类型为:" + list);
        return list;
    }

    @Override
    public List<String> buildAmtInterval() {
        List<String> list = new ArrayList<>();
        list.add("1-9");
        list.add("2-10");
        System.out.println("查询用户浏览的商品价格区间为:" + list);
        return list;
    }

    @Override
    public User getUser() {
        User user = new User();
        user.setNickname(this.buildNicaname());
        user.setPayCnt(this.buildPayCnt());
        user.setPayAmt(this.buildPayAmt());
        user.setProductType(this.buildProductType());
        user.setAmtInterval(this.buildAmtInterval());
        return user;
    }
}

第四步,编写 Director 类,对精准营销和刺激消费两块业务分别提供对应的获取 User 的方法。这里为了方便调用,方法全部采用 static 的

public class Director {

    // 为精准营销提供获取User的方法
    public static User getJzyxUser() {
        IUserBuilder userBuilder = new UserBuilder("360");
        return userBuilder.getUser();
    }

    // 为刺激消费提供获取User的方法
    public static User getCjxfUser() {
        IUserBuilder userBuilder = new UserBuilder("30");
        return userBuilder.getUser();
    }
}

最后一步,模拟精准营销和刺激消费的业务,分别获取对应的 User 对象

 public static void main(String[] args) {
 // 模拟精准营销业务逻辑
 User jzyxUser = Director.getJzyxUser();
 System.out.println("精准营销获得的User对象为:" + jzyxUser);
 System.out.println("开始精准营销的业务逻辑");

 // 模拟刺激消费业务逻辑
 User cjxfUser = Director.getCjxfUser();
 System.out.println("刺激消费获得的User对象为:" + cjxfUser);
 System.out.println("开始刺激消费的业务逻辑");
}

这就用生成器模式实现了小姐姐的需求

对于精准营销或刺激消费的业务逻辑来说,它们不用再关心 User 对象的创建过程,可以更专注于自身的业务逻辑,无论是代码阅读或后期维护都更方便

总结

生成器模式也被称作创建者模式或建造者模式,它属于设计模式三大类型中的创建型模式

与工厂模式相比,生成器模式更善于处理创建步骤固定的复杂对象。它与工厂模式并没有很明显的界限,在许多设计初期,大部分程序员都习惯用工厂方法模式来构建代码,随着业务变得复杂,代码也会不断的重构。代码架构也逐渐的演变成抽象工厂模式、生成器模式

生成器模式也不能频繁的使用,如果项目的内部变化复杂,可能会导致需要定义很多具体生成器类来实现这种变化,导致系统变得很庞大

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypxzx.html