【设计模式】——建造者模式

【情景展示】    

    如今已经是信息化的时代,网络已经融入每一个家庭,移动通信业也迅猛发展,4G、5G通信技术日趋完善。面对这个庞大的蛋糕,各个通信运营商间也展开了激烈的竞争。为了吸引更多的消费者,各大运营商开始使用套餐。例如:20元包400条短信套餐,30元包600条短信套餐。
    下面,我们来看看张三如何去通信营业厅办理手机套餐的。
    客户——张三,最近新买了一部OPPO R11手机,使用的是某通信运营商的通信服务。听说该运营商提供的通信服务有很多手机套餐可供选择,都是比较实惠的,张三想了想还是要选择一个适合自己的手机套餐,否则,这一个月的花销都花在话费上了。说话间,他已来到一个营业厅网点。
    操作员:你好,先生,请问想要办理什么业务?
    张三:你好,请问有什么优惠手机套餐?
    操作员:好的,目前有20元包400条短信的手机套餐和30元包600条短信的手机套餐,两种套餐必须开通彩铃业务。
   (操作员回答的很熟练嘛!一定很多人办理,张三心里想)
    张三:哦,是这样啊。哪一种套餐比较划算呢?
    操作员:先生,这要看您的具体消费情况了。如果您每月发短信很多,建议您选择30元600条短信套餐,如果发短信不是很多,您可以选择20元包400条短信的套餐。
    张三:哦,好的。嗯……(思考一番),那我办理20元400条短信的套餐吧。
    操作员:好的,先生。
   (操作员开始操作计算机,设置客户手机套餐了)
   (张三一旁好奇的看着,噢?原来设置手机套餐还要分几步的!张三心里嘀咕着。设置用户话费20元,短信400条,最后设置了彩铃)。
    操作员:好了,先生。您的套餐已经设置完成。次月生效!

    张三:哦,好的,还真快啊。谢谢!

    操作员:不客气,先生,请问还要办理其他业务吗?
    张三:没有了。(起身要离开)
    操作员:好的,先生。那您慢走了,欢迎下次光临!
    张三满心欢喜地走了,这里的服务态度真好,心情也好,又获得了想要的手机套餐!

【模式定义】

建造者模式是一个构造复杂对象的设计模式。

建造者模式把复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示。

【静态建模】

    角色分析

    客户张三——终端需求

    营业厅操作员——指导者(通知指导建造者生产什么样的手机套餐)

    计算机——建造者(建造各种手机套餐)

【代码实现】

工程结构图:


1、创建产品,手机套餐——MobilePackage

package com.demo.builder.model;

/**
 * 手机套餐
 */
public class MobilePackage {
    //话费
    private float money;
    //短信
    private int shortInfo;
    //彩铃
    private String music;

    public float getMoney() {
        return money;
    }

    public void setMoney(float money) {
        this.money = money;
    }

    public int getShortInfo() {
        return shortInfo;
    }

    public void setShortInfo(int shortInfo) {
        this.shortInfo = shortInfo;
    }

    public String getMusic() {
        return music;
    }

    public void setMusic(String music) {
        this.music = music;
    }
}
2、建立抽象建造者

(1)建造者接口——IMobileBuilder

package com.demo.builder.itf;

import com.demo.builder.model.MobilePackage;

/**
 * 手机套餐
 */
public interface IMobileBuilder {
    //建造手机套餐的话费
    public void buildMoney();

    //建造手机套餐的短信
    public void buildShortInfo();

    //建造手机套餐的彩铃
    public void buildMusic();

    //返回建造的手机套餐对象
    public MobilePackage getMobilePackage();

}
(2)抽象建造者——AbstractBasePackage

package com.demo.builder.base;

import com.demo.builder.model.MobilePackage;

public abstract class AbstractBasePackage {
    //手机套餐实例变量(为了在不同包下的子类使用)
    protected MobilePackage mobilePackage;

    public AbstractBasePackage(){
        this.mobilePackage = new MobilePackage();
    }
}
3、建立具体建造者

(1)具体建造者1——MobileBuilderImpl1

     (20元包400条短信的手机套餐)

package com.demo.builder.itf;

import com.demo.builder.base.AbstractBasePackage;
import com.demo.builder.model.MobilePackage;

/**
 * 套餐1:
 */
public class MobileBuilderImpl1 extends AbstractBasePackage implements IMobileBuilder{

    //建造手机套餐的话费
    public void buildMoney(){
        this.mobilePackage.setMoney(20.0f);
    }

    //建造手机套餐的彩铃
    public void buildMusic(){
        this.mobilePackage.setMusic("天使");
    }

    //建造手机套餐的短信
    public void buildShortInfo(){
        this.mobilePackage.setShortInfo(400);
    }

    //返回建造的手机套餐对象
    public MobilePackage getMobilePackage(){
        return this.mobilePackage;
    }
}

(2)具体建造者2——MobileBuilderImpl2

     (30元包600条短信的手机套餐)

package com.demo.builder.itf;

import com.demo.builder.base.AbstractBasePackage;
import com.demo.builder.model.MobilePackage;

/**
 * 套餐2
 */
public class MobileBuilderImpl2 extends AbstractBasePackage implements IMobileBuilder{

    //建造手机套餐的话费
    public void buildMoney(){
        this.mobilePackage.setMoney(30.0f);
    }

    //建造手机套餐的彩铃
    public void buildMusic(){
        this.mobilePackage.setMusic("大海");
    }

    //建造手机套餐的短信
    public void buildShortInfo(){
        this.mobilePackage.setShortInfo(600);
    }

    //返回建造的手机套餐对象
    public MobilePackage getMobilePackage(){
        return this.mobilePackage;
    }
}
4、创建指导者——MobileDirector

package com.demo.builder.director;

import com.demo.builder.itf.IMobileBuilder;
import com.demo.builder.model.MobilePackage;

public class MobileDirector {
    public MobilePackage createMobilePackage(IMobileBuilder mobileBuilder){
        if (mobileBuilder != null){
            //构建话费
            mobileBuilder.buildMoney();
            //构建短信
            mobileBuilder.buildShortInfo();
            //构建彩铃
            mobileBuilder.buildMusic();
            //返回手机套餐
            return mobileBuilder.getMobilePackage();
        }
        return null;
    }
}
5、主应用程序——MainApp

package com.demo.builder;

import com.demo.builder.director.MobileDirector;
import com.demo.builder.itf.MobileBuilderImpl1;
import com.demo.builder.itf.MobileBuilderImpl2;
import com.demo.builder.model.MobilePackage;


public class MainApp {
    /**
     * 主应用程序
     */
    public static void main(String[] args){

        //创建指导者
        MobileDirector mobileDirector = new MobileDirector();
        //套餐1
        MobileBuilderImpl1 mobileBuilderImpl1 = new MobileBuilderImpl1();
        //套餐2
        MobileBuilderImpl2 mobileBuilderImpl2 = new MobileBuilderImpl2();

        printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl1));
        printMessage(mobileDirector.createMobilePackage(mobileBuilderImpl2));
    }

    /**
     * 打印输出套餐信息
     */
    public static void printMessage(MobilePackage mobilePackage){
        System.out.println("话费:" + mobilePackage.getMoney() + "\t短信:" +
                mobilePackage.getShortInfo() + "条\t彩铃:" + mobilePackage.getMusic());
    }

}
6、运行效果


【小结】

1、建造者模式

建造者模式将复杂对象的创建与表示分离,使得同样的构建过程可以创建不同的表示。

2、设计原则

(1)分步骤创建复杂对象,使构建复杂对象变得不那么复杂;

(2)构建和表示分离,更好地适应外部需求的变化;

(3)单一职责原则,提高软件内部的聚合度,降低模块之间的耦合度。

3、建造者模式和抽象工厂模式的区别

(1)建造者模式着重于分步构造一个复杂对象,而抽象工厂模式则着重多个系列的产

对象即对象族(简单的或者复杂的)的构造;

(2)建造者模式是在最后一步返回具体产品,而抽象工厂模式则是立即返回具体产品。

4、使用场合

(1)当生产的产品对象内部具有复杂的结构时;

(2)当复杂对象需要与表示分离,可能需要创建不同的表示时;

(3)当需要向客户隐藏产品内部结构的表示时。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章