定义: 将一个复杂的对象通过简单的对象一步一步的构建出来。叫做建造者设计模式(builder)。 具体结构图(图片摘自百度百科)需要的角色: 产品(Product): 即需要构建的对象。 抽象构建造者(Builder): 构建产品和提供产品示实例。 具体建造者(CreateBuilder):具体实现产品的构建和实例的创建, Builder 的具体实现类。 指挥者(Director): 使用具体的建造者来构建产品,并获取产品。 使用场景: 1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 2、相同的方法,不同的执行顺序,产生不同的事件结果时。 3、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。 4、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。 5、创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。 应用实例: 1、肯德基店的产品,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。 优点: 1、使用建造者模式可以使客户端不必知道产品内部组成的细节。 2、具体的建造者类之间是相互独立的,容易扩展。 3、由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。 4、将构建和表现分离,降低耦合性。 缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。 注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。 案例分析:
比如我们去可肯德基点餐,我们可以根据自己的需求选择不同的食物, 这些食物是根据不同人的要求是不一样的, 但是服务员给我们打包的过程是一样的,我们不需要知道打包的过程,我们只需要向服务员提供我们需要的食物即可。这样的场景就适合使用建造者模式。
示例代码(本示例以 “肯德基的套餐 ”为例)
产品类:抽象建造者类:public class MealBean { private String hamburger; private String coke; private String fries; private String chicken; public void setHamburger(String hamburger) { this.hamburger = hamburger; } public void setCoke(String coke) { this.coke = coke; } public void setFries(String fries) { this.fries = fries; } public void setChicken(String chicken) { this.chicken = chicken; } @Override public String toString() { return "MealBean{" + "hamburger='" + hamburger + '\'' + ", coke='" + coke + '\'' + ", fries='" + fries + '\'' + ", chicken='" + chicken + '\'' + '}'; } }
具体建造者类:public abstract class Builder { public abstract void builderHamburger(String hamburger); public abstract void builderCoke(String coke); public abstract void builderFries(String fries); public abstract void builderChicken(String chicken); public abstract MealBean createBuilder(); }
指挥者类:public class MealBuilder extends Builder { private MealBean mMeal; public MealBuilder() { mMeal = new MealBean(); } @Override public void builderHamburger(String hamburger) { this.mMeal.setHamburger(hamburger); } @Override public void builderCoke(String coke) { this.mMeal.setCoke(coke); } @Override public void builderFries(String fries) { this.mMeal.setFries(fries); } @Override public void builderChicken(String chicken) { this.mMeal.setChicken(chicken); } @Override public MealBean createBuilder() { return mMeal; } }
测试代码:public class MealDirector { private MealBuilder mBuilder; public MealDirector() { this.mBuilder = new MealBuilder(); } public MealBean getMealBean(String hamburger, String coke, String fries, String chicken){ mBuilder.builderHamburger(hamburger); mBuilder.builderCoke(coke); mBuilder.builderFries(fries); mBuilder.builderChicken(chicken); return mBuilder.createBuilder(); } }
测试结果:MealDirector mealDirector = new MealDirector(); MealBean mealBean = mealDirector.getMealBean("火腿汉堡", "可口可乐", "炸薯条", null); System.out.println(mealBean.toString());
设计模式之建造者模式
最新推荐文章于 2024-03-25 09:55:38 发布