一:建造者模式
将复杂对象的创建与表示分离,同样的创建过程可创造不同的表示
二:设计原则
(1)分步骤创建复杂对象
(2)构建与表示分离
(3)单一职责
三:建造者模式和抽象工厂模式的区别
(1)建造者分步骤构建一个复杂对象;抽象工厂构建对象族
(2)建造者模式在最后一步返回具体产品;抽象工厂则立即返回具体产品
四:使用场合
(1)对象复杂结构
(2)复杂对象需要与表示分离,创建不同的表示
要创建一个复杂对象如手机套餐,套餐中有3个复杂业务,短信、彩信、话费
package SheJiMoShiNaDianShi.Builder.model;
/**
* Created by hjw on 16/8/29.
* 创建产品-手机套餐
*/
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;
}
}
package SheJiMoShiNaDianShi.Builder.itf;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
* 抽象构建者接口
*/
public interface IMobileBuilder {
//构建手机套餐的话费
public void buildMoney();
//构建手机套餐的短信
public void buildShortInfo();
//构建手机套餐的彩信
public void buildMusic();
//返回构建的手机套餐对象
public MobilePackage getMobilePackage();
}
===============================================
package SheJiMoShiNaDianShi.Builder.base;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
* 抽象构造者
*/
public abstract class AbstractBasePackage {
protected MobilePackage mobilePackage;
public AbstractBasePackage() {
this.mobilePackage = new MobilePackage();
}
}
================================================
package SheJiMoShiNaDianShi.Builder.itf;
import SheJiMoShiNaDianShi.Builder.base.AbstractBasePackage;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
* 20圆400条短信
*/
public class MobileBuilderImpl1 extends AbstractBasePackage implements IMobileBuilder {
@Override
public void buildMoney() {
this.mobilePackage.setMoney(20.0f);
}
@Override
public void buildShortInfo() {
this.mobilePackage.setShortInfo(400);
}
@Override
public void buildMusic() {
this.mobilePackage.setMusic("天使");
}
@Override
public MobilePackage getMobilePackage() {
return this.mobilePackage;
}
}
================================================
package SheJiMoShiNaDianShi.Builder.itf;
import SheJiMoShiNaDianShi.Builder.base.AbstractBasePackage;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
* 40圆200条短信
*/
public class MobileBuilderImpl2 extends AbstractBasePackage implements IMobileBuilder {
@Override
public void buildMoney() {
this.mobilePackage.setMoney(40.0f);
}
@Override
public void buildShortInfo() {
this.mobilePackage.setShortInfo(200);
}
@Override
public void buildMusic() {
this.mobilePackage.setMusic("大海");
}
@Override
public MobilePackage getMobilePackage() {
return this.mobilePackage;
}
}
================================================
package SheJiMoShiNaDianShi.Builder.model;
/**
* Created by hjw on 16/8/29.
* 创建产品-手机套餐
*/
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;
}
}
================================================
package SheJiMoShiNaDianShi.Builder.director;
import SheJiMoShiNaDianShi.Builder.itf.IMobileBuilder;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
*/
public class MobileDirector {
public MobilePackage creatMobilePackage(IMobileBuilder mobileBuilder){
if(mobileBuilder != null){
mobileBuilder.buildMoney();
mobileBuilder.buildShortInfo();
mobileBuilder.buildMusic();
return mobileBuilder.getMobilePackage();
}else
return null;
}
}
================================================
package SheJiMoShiNaDianShi.Builder;
import SheJiMoShiNaDianShi.Builder.director.MobileDirector;
import SheJiMoShiNaDianShi.Builder.itf.MobileBuilderImpl1;
import SheJiMoShiNaDianShi.Builder.itf.MobileBuilderImpl2;
import SheJiMoShiNaDianShi.Builder.model.MobilePackage;
/**
* Created by hjw on 16/8/30.
*/
public class MainApp {
public static void main(String[] args) {
MobileDirector mobileDirector = new MobileDirector();
// 套餐1
MobileBuilderImpl1 mobileBuilderImpl1 = new MobileBuilderImpl1();
MobileBuilderImpl2 mobileBuilderImpl2 = new MobileBuilderImpl2();
printMessage(mobileDirector.creatMobilePackage(mobileBuilderImpl1));
printMessage(mobileDirector.creatMobilePackage(mobileBuilderImpl2));
System.out.println(mobileBuilderImpl1.getMobilePackage().getMoney());
}
public static void printMessage(MobilePackage mobilePackage){
System.out.println("--话费:"+mobilePackage.getMoney() + "\t+短信:"+mobilePackage.getShortInfo()
+"\t彩信:"+mobilePackage.getMusic());
}
}