在学习静态内部类的时候时候发现了这种设计模式,网上看了一些资料按照自己的理解写了出来。
1 什么是Builder设计模式
- 复杂事物的构建和表示相分离,这句话是对建造者模式的总结,事物的构建过程是固定的,不同方式的实现,可以构建出不同对象,例如:一家餐馆推出3菜一汤套餐,菜品有多个,三菜一汤可以自己组合。
- Builder设计模式分为经典模式和变种模式。
- 设计构图
2 Builder经典设计模式
- 经典模式不经常使用,但是有助于对变种模式的理解;
建立一个套餐类meals
package com.lizheng.Builder.ClassicBuild;
//设置一个套餐3菜一汤,可以根据不同的菜组成这个套餐
public class Meals {
private String mealOne;//菜品一
private String mealtwo;//菜品二
private String mealthree;//菜品三
private String soup;//汤
//设置get和set方法
public String getMealOne() {
return mealOne;
}
public void setMealOne(String mealOne) {
this.mealOne = mealOne;
}
public String getMealtwo() {
return mealtwo;
}
public void setMealtwo(String mealtwo) {
this.mealtwo = mealtwo;
}
public String getMealthree() {
return mealthree;
}
public void setMealthree(String mealthree) {
this.mealthree = mealthree;
}
public String getSoup() {
return soup;
}
public void setSoup(String soup) {
this.soup = soup;
}
//重写toString方法
@Override
public String toString(){
String meals="菜品一是"+mealOne+"\n"+"菜品二是"+mealtwo+"\n"+"菜品三是"+mealthree+"\n"+"汤是"+soup;
return meals;
}
}
抽象出选菜的过程,接口MealsBuilder
//把三菜一汤的方法抽象出来
public interface MealsBuilder {
//设置一个菜品一
void setmealOne();
//设置一个菜品二
void setMealtwo();
//设置一个菜品三
void setMealthree();
//设置一碗汤
void setsoup();
//获取三菜一汤的信息
Meals getMeals();
}
选出一个A顾客的套餐
package com.lizheng.Builder.ClassicBuild;
//A套餐
public class MealsA implements MealsBuilder {
private Meals mealas;
public MealsA(){
this.mealas=new Meals();
}
@Override
public void setmealOne() {
mealas.setMealOne("红烧肉");
}
@Override
public void setMealtwo() {
mealas.setMealtwo("烧白");
}
@Override
public void setMealthree() {
mealas.setMealthree("青椒肉丝");
}
@Override
public void setsoup() {
mealas.setSoup("平菇肉片汤");
}
@Override
public Meals getMeals() {
return mealas;
}
}
由服务员把几种菜品组装
package com.lizheng.Builder.ClassicBuild;
public class Director {
//声明MealsBuilder变量类型
private MealsBuilder mealsBuilderA;
//对mealsBuilderA的值进行初始化
public Director(MealsBuilder mealsBuilder ){
this.mealsBuilderA=mealsBuilder;
};
//setMealsBuilder方法组装菜品
public void setMealsBuilder(){
mealsBuilderA.setmealOne();
mealsBuilderA.setMealtwo();
mealsBuilderA.setMealthree();
mealsBuilderA.setsoup();
}
public Meals getMeals(){
//返回一个meals对象
return mealsBuilderA.getMeals();
}
}
打印
package com.lizheng.Builder.ClassicBuild;
public class Director {
//声明MealsBuilder变量类型
private MealsBuilder mealsBuilderA;
//对mealsBuilderA的值进行初始化
public Director(MealsBuilder mealsBuilder ){
this.mealsBuilderA=mealsBuilder;
};
//调用方法
public void setMealsBuilder(){
mealsBuilderA.setmealOne();
mealsBuilderA.setMealtwo();
mealsBuilderA.setMealthree();
mealsBuilderA.setsoup();
}
public Meals getMeals(){
//返回一个meals对象
return mealsBuilderA.getMeals();
}
}
3 Builder变种设计模式
- 餐馆换老板了,换了一种经营模式,改成了小碗菜经营模式,餐馆固定7个小碗菜,每个价格相同,食客可以任意选择,米饭为必点。
package com.lizheng.Builder.variety;
public class Menu {
//菜品一
private String Menuone;
//菜品二
private String Menutwo;
//菜品三
private String Menuthree;
//菜品四
private String Menufour;
//菜品五
private String Menufive;
//菜品六
private String Menusix;
//菜品七
private String Menuseven;
//米
private String rice;
//设置get方法
public String getMenuone() {
return Menuone;
}
public String getMenutwo() {
return Menutwo;
}
public String getMenuthree() {
return Menuthree;
}
public String getMenufour() {
return Menufour;
}
public String getMenufive() {
return Menufive;
}
public String getMenusix() {
return Menusix;
}
public String getMenuseven() {
return Menuseven;
}
public String rice() {
return rice;
}
//构造方法把值传递给menu
public Menu(Builder builder){
this.rice=builder.rice;
this.Menuone=builder.Menuone;
this.Menutwo=builder.Menutwo;
this.Menuthree=builder.Menuthree;
this.Menufour=builder.Menufour;
this.Menufive=builder.Menufive;
this.Menusix=builder.Menusix;
this.Menuseven=builder.Menuseven;
}
//设置一个静态内部类Builder
public static class Builder{
//菜品一
private String Menuone;
//菜品二
private String Menutwo;
//菜品三
private String Menuthree;
//菜品四
private String Menufour;
//菜品五
private String Menufive;
//菜品六
private String Menusix;
//菜品七
private String Menuseven;
//米
private String rice;
public Builder(String rice){
this.rice=rice;
}
//设置菜品一
public Builder setMenuone(String Menuone){
this.Menuone=Menuone;
return this;
}
//设置菜品二
public Builder setMenutwo(String Menutwo){
this.Menutwo=Menutwo;
return this;
}
//设置菜品三
public Builder setMenuthree(String Menuthree){
this.Menuthree=Menuthree;
return this;
}
//设置菜品四
public Builder setMenufour(String Menufour){
this.Menufour=Menufour;
return this;
}
//设置菜品五
public Builder setMenufive(String Menufive){
this.Menufive=Menufive;
return this;
}
//设置菜品六
public Builder setMenusix(String Menusix){
this.Menusix=Menusix;
return this;
}
//设置菜品七
public Builder setMenuseven(String Menuseven){
this.Menuseven=Menuseven;
return this;
}
//返回menus对象
public Menu getCustMenu(){
return new Menu(this);
}
}
}
展示使用
package com.lizheng.Builder.variety;
public class variety {
public static void main(String[] args) {
//顾客A的点餐
Menu menuA=new Menu.Builder("蛋炒饭")
.setMenuone("红烧肉")
.setMenutwo("烧白")
.setMenutwo("青椒肉丝")
.getCustMenu();
//顾客B的点餐
Menu menuB=new Menu.Builder("蛋炒饭")
.setMenuone("小炒肉")
.setMenutwo("香辣猪肝")
.getCustMenu();
}
}
总结:什么时候会选择这样的设计模式,当一些基本的物料不会变,而其组合经常变化的时候,就可以选择建造者模式来构建代码