服装 公司 网站建设,cms开源系统,十堰h5网站建设,中石油第七建设公司网站一、什么是建造者模式 建造者模式是一种创建型设计模式#xff0c;也叫生成器模式。
定义#xff1a;封装一个复杂对象构造过程#xff0c;并允许按步骤构造。
解释#xff1a;就是将复杂对象的创建过程拆分成多个简单对象的创建过程#xff0c;并将这些简单对象组合起来…一、什么是建造者模式 建造者模式是一种创建型设计模式也叫生成器模式。
定义封装一个复杂对象构造过程并允许按步骤构造。
解释就是将复杂对象的创建过程拆分成多个简单对象的创建过程并将这些简单对象组合起来构建出复杂对象。
二、角色组成 产品类Product表示被创建的复杂对象。它通常包含多个部分或者组成并由具体的建造者逐步构建而成。 抽象建造者类Builder定义了建造复杂对象所需要的各个部分的创建方法。它通常包括多个构建方法和一个返回产品的方法。 具体建造者类ConcreteBuilder实现Builder接口并提供各个部分或者组成的构建方法。 指挥者类Director负责控制建造者的构建顺序指挥建造者如何构建复杂对象。 三、优缺点 优点
灵活可以分步骤地构建复杂对象使得构建过程更加灵活。 解耦可以隔离复杂对象的创建和使用客户端不必关心对象的创建细节。 易扩展增加新的具体建造者很方便可以扩展构建器功能符合开闭原则。 缺点
增加工作量需要额外的代码来创建和管理具体建造者类增加了程序员的工作量。 效率低相比于其他创建型模式在运行时效率较低特别是对象太复杂时。 四、应用场景 4.1 生活场景 盒饭套餐顾客可以选择不同的菜服务员按照顾客的要求将这些菜组合起来最终构建出一个完整的套餐。 盖房子需要分多个阶段进行比如准备材料、打地基、盖围墙…。建造者模式可以将房屋的建造分解成多个步骤每个步骤对应一个具体的建造者最终由包工头指导者来调用不同的建造者完成整个房子的建造。 4.2 java场景
StringBuilder能够动态地构建字符串。
Stream API将集合类转为stream流通过一系列的中间操作和终止操作来生成最终结果。
Lombok的Builder注解一个注解就可以生成建造者模式的代码。五、代码实现 肯德徳都吃过吧里面有很多的套餐。假设套餐主要由汉堡、薯条和饮料三种组成每个组件都有不同种类和大小并且每个套餐的组合方式也不同。下面以肯德徳套餐为例解释建造者模式。 产品类Meal 抽象建造者类MealBuilder 具体建造者类BeefBurgerMealBuilder、ChickenMealBuilder、ShrimpMealBuilder 指挥者类MealDirector 5.1 产品类Product
/*** * 1.产品类Product*/
Data
public class Meal {//汉堡包private String burger;//薯条private String fries;//饮料private String drink;
}5.2 抽象建造者Builder
/*** * 2.抽象建造者Builder*/
public abstract class MealBuilder {protected Meal mealnew Meal();//构建汉堡public abstract void buildBurger();//构建薯条public abstract void buildFries();//构建饮料public abstract void buildDrink();public Meal getMeal(){return meal;}
}5.3 具体构建者ConcreteBuilder
/**** 3.具体建造者ConcreteBuilder)鸡肉汉堡套餐*/
public class ChickenMealBuilder extends MealBuilder{Overridepublic void buildBurger() {meal.setBurger(鸡肉汉堡);}Overridepublic void buildFries() {meal.setFries(中份薯条);}Overridepublic void buildDrink() {meal.setDrink(大杯果汁);}
}/*** * 3.具体建造者ConcreteBuilder)牛肉汉堡套餐*/
public class BeefBurgerMealBuilder extends MealBuilder {Overridepublic void buildBurger() {meal.setBurger(牛肉汉堡);}Overridepublic void buildFries() {meal.setFries(大份薯条);}Overridepublic void buildDrink() {meal.setDrink(中杯可乐);}
}
/*** * 3.具体建造者ConcreteBuilder)虾肉汉堡套餐*/
public class ShrimpMealBuilder extends MealBuilder {Overridepublic void buildBurger() {meal.setBurger(虾肉汉堡);}Overridepublic void buildFries() {meal.setFries(小份薯条);}Overridepublic void buildDrink() {meal.setDrink(大杯芬达);}
}5.4 指导者Director /*** * 4.指导者Director*/
public class MealDirector {private MealBuilder mealBuilder;public void setMealBuilder(MealBuilder mealBuilder){this.mealBuildermealBuilder;}public Meal getMeal(){return mealBuilder.getMeal();}//制作套餐public void constructMeal(){mealBuilder.buildBurger();mealBuilder.buildFries();mealBuilder.buildDrink();}
}
5.5 testBuilder
/*** * 建造者模式测试类*/
SpringBootTest
public class TestBuilder {Testvoid testBuilder(){//创建指导者MealDirector directornew MealDirector();//执导建造牛肉套餐director.setMealBuilder(new BeefBurgerMealBuilder());director.constructMeal();Meal meal director.getMeal();System.out.println(牛肉套餐meal.toString());//鸡肉套餐director.setMealBuilder(new ChickenMealBuilder());director.constructMeal();Meal meal2 director.getMeal();System.out.println(鸡肉套餐meal2.toString());//虾肉套餐director.setMealBuilder(new ShrimpMealBuilder());director.constructMeal();Meal meal3 director.getMeal();System.out.println(虾肉套餐meal3.toString());}
}根据不同的需求建造者模式可以构造出不同的套餐对象。每个套餐的构建过程都由不同的建造者实现在构建过程中可定制相应的属性。最终因为套餐的构建过程和表示分离所以同样的构建过程可以创建出不同的表示。
六、总结 使用场景
当需要创建一些特定的对象但是它们拥有共同的组成部分时比如一个房子可以由个个部件框架、墙、窗户等这些部件可以组合起来构造完整的房子。 当对象的构建过程比较复杂且需要多个步骤时例如创建一份电子商务订单需要多个步骤如选择商品、填写地址和支付等这些步骤可以被分别封装成为订单构建器中的不同方法。 当需要创建一些特定类型的对象例如复杂的数据结构或配置对象时这在编写配置文件解析器以及通用数据结构如二叉树等时很有用。 建造者模式也可以被用于通过更高级的方式来构建复杂对象例如序列化和反序列化。 与抽象工厂模式的区别 抽象工厂模式强调的是产品族的创建即相关的产品一起被创建出来而建造者模式强调的是一个复杂对象的创建即它的各个部分逐步被创建出来。