【情景展示】
如今已经是信息化的时代,网络已经融入每一个家庭,移动通信业也迅猛发展,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)当需要向客户隐藏产品内部结构的表示时。