Android设计模式-建造者模式-创建型-1
创建型模式 (3)
行为型模式 (2)
结构型模式 (3)
- Android设计模式Github项目地址: 点击跳转
0. 什么是建造者模式?
1、将一个复杂的对象分离,使用多个简单的对象一步步的建造构成一个复杂的对象。
1. 优缺点
优点:
1、将复杂的创建过程封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,也不知道,具有良好的封装性,可以使客户端不用知道产品内部组成的细节。
2、建造者独立,容易扩展。就是解耦。
缺点:
1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。
2. 哪些库或方法使用建造者模式来实现的?
AlterDialog、Notification、Gson、Okhttp
3. 举例说明-顾客在麦当劳里点餐
1、麦当劳里的食物商品可以视作为
简单的对象
2、麦当劳将几种食物商品(简单的对象
)组合起来成为套餐,并且提供顾客额外添加食物商品和买单方法。
3、这一套流程就形成了一个点餐机制可以视为复杂的对象
。
4、顾客不必知道简单的对象
是怎么制作的,只需要按照流程点餐即可。
1.、食物种类(
复杂的对象
) 包含如下简单的对象
->包装类型
2.、食物商品(复杂的对象
) 包含如下简单的对象
->食物种类(被封装过,所以可以相对视为简单对象),价格,名字
3.、整套点餐机制(复杂的对象
) 如下简单的对象
->食物商品(被封装过,所以可以相对视为简单对象),买单
食物种类:汉堡、饮料
食物包装类型:纸质、塑料瓶
食物商品具有的属性:食物种类、食物包装类型、名字、价格
食物商品:【香辣鸡腿堡】【巨无霸汉堡】【可乐】【饮料】
基本套餐:香辣鸡腿堡套餐(香辣鸡腿堡+可乐)、巨无霸汉堡套餐(巨无霸汉堡+雪碧)
定义实现食物包装类型
- 1-1.
FoodPackingStyle
/**
* 食物包装的抽象类
*/
public interface FoodPackingStyle {
String packStyle();
}
- 1-2.
BottlePacking
/**
* 食物包装的具体实现类 - 塑料瓶包装
*/
public class BottlePacking implements FoodPackingStyle {
@Override
public String packStyle() {
return "塑料瓶包装";
}
}
- 1-3.
WrapperPacking
/**
* 食物包装的具体实现类 - 纸质包装
*/
public class WrapperPacking implements FoodPackingStyle {
@Override
public String packStyle() {
return "纸质包装";
}
}
定义实现食物种类
- 2-1.
FoodItem
/**
* 食物商品的抽象类
* 一件食物作为商品其具有定义的属性有【名字、包装类型、价格】
*/
public interface FoodItem {
//食物名字
String foodName();
//食物包装类型 - 有【纸质包装,塑料盒包装】
FoodPackingStyle foodPackingStyle();
//食物价格
float foodPrice();
}
- 2-2.
FoodBurger
/**
* 食物-汉堡-抽象类(汉堡可以有许多种)
*/
public abstract class FoodBurger implements FoodItem {
//返回具体食品包装类型的实现类,汉堡一律都是纸质包装
@Override
public FoodPackingStyle foodPackingStyle() {
return new WrapperPacking();
}
}
- 2-3.
FoodDrink
/**
* 食物-饮料-抽象类(饮料可以有许多种)
*/
public abstract class FoodDrink implements FoodItem{
//返回具体食品包装类型的实现类,饮料一律都是塑料瓶包装
@Override
public FoodPackingStyle foodPackingStyle() {
return new BottlePacking();
}
}
定义实现食物商品
- 3-1.
BigMacBurger
/**
* 巨无霸腿堡-食物商品-汉堡的具体实现类
*/
public class BigMacBurger extends FoodBurger {
@Override
public String foodName() {
return "巨无霸汉堡";
}
@Override
public float foodPrice() {
return 27;
}
}
- 3-2.
HotSpicyChickenBurger
/**
* 香辣鸡腿堡-食物商品-汉堡的具体实现类
*/
public class HotSpicyChickenBurger extends FoodBurger {
@Override
public String foodName() {
return "香辣鸡腿堡";
}
@Override
public float foodPrice() {
return 30;
}
}
- 3-3.
CocaColaDrink
/**
* 可口可乐-食物商品-饮料-的具体实现类
*/
public class CocaColaDrink extends FoodDrink {
@Override
public String foodName() {
return "可口可乐";
}
@Override
public float foodPrice() {
return 10;
}
}
- 3-4.
SpriteDrink
/**
* 雪碧-食物商品-饮料-的具体实现类
*/
public class SpriteDrink extends FoodDrink {
@Override
public String foodName() {
return "雪碧";
}
@Override
public float foodPrice() {
return 10;
}
}
Builder类,提供给顾客创建菜单调用
- 4-1.
MealBuilder
/**
* 创建套餐Builder类
*/
public class MealBuilder {
private List<FoodItem> itemsList = new ArrayList<FoodItem>();
private String name;
//点餐必须带上顾客名字
public MealBuilder(String name){
this.name = name;
}
//香辣鸡腿堡套餐内必须含有一个【香辣鸡腿堡】,一杯【可乐】
public MealBuilder hotSpicyChickenBurgerMealComb(){
itemsList.add(new HotSpicyChickenBurger());
itemsList.add(new CocaColaDrink());
return this;
}
//巨无霸套餐内必须含有一个【巨无霸汉堡】,一杯【雪碧】
public MealBuilder bigMacBurgerMealComb(){
itemsList.add(new BigMacBurger());
itemsList.add(new SpriteDrink());
return this;
}
//对外提供添加食物商品的方法,如果客人觉得不够可自由添加其他食品
public MealBuilder addFoodProduct(FoodItem foodItem){
itemsList.add(foodItem);
return this;
}
//计算价格
private float getCost(){
float cost = 0.0f;
for (FoodItem item : itemsList) {
cost += item.foodPrice();
}
return cost;
}
//买单并展示套餐内所有商品信息
public void doCheck(){
System.out.println("建造者模式:>> "+name+" 您的套餐包含如下食品>> ");
for (FoodItem item : itemsList) {
System.out.println("建造者模式:>> 名字:"+item.foodName()+" 包装:"+item.foodPackingStyle().packStyle()+" 单价:"+item.foodPrice());
}
System.out.println("建造者模式:>> 您需要支付总价为 "+getCost()+" RMB。");
System.out.println("建造者模式:>> 结束。");
}
}
- 4-2.
BuildPatternActivity
public class BuildPatternActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_build_pattern);
/**
* 小明 开始点餐-> 选择了一份【香辣鸡腿堡套餐】-> 买单
*/
MealBuilder mealBuilderA = new MealBuilder("小明").hotSpicyChickenBurgerMealComb();
mealBuilderA.doCheck();
/**
* 王老二 开始点餐-> 选择了一份【巨无霸汉堡套餐】-> 感觉不够吃,又点了单个【香辣鸡腿堡】->买单
*/
MealBuilder mealBuilderB = new MealBuilder("王老二").bigMacBurgerMealComb().addFoodProduct(new HotSpicyChickenBurger());
mealBuilderB.doCheck();
}
}
运行后的结果是:
4. 与工厂模式的区别
总体而言建造者模式是交由客户端,可以自由的一步步的将简单对象组合在一起,最后建造出一个复杂的对象,并生成复杂对象的实例。
而工厂模式也可以理解成是用一个个简单的对象组合起来,最后造出一个复杂的对象。不同的是工厂是把组合建造出一个复杂的对象的整个流程在自己内部定义好,最后让客户端直接创建生产一个复杂对象的实例。
5. Android技术生活交流
微信