建造者模式
模式定义
建造者模式:将一个复杂的对象的构建和表示分离,使得同样的构建过程可以创建不同的表示,建造者模式是一步一步创建一个复杂的对象它允许用户只通过指定复杂对象的类型和内容就可以构建他们,用户不需要具体的内部构建细节,建造者模式属于对象创建型模式,
模式结构
模式分析
建造者模式有如下角色
1、Builder(抽象建造者)
在该接口中,一般声明两个两类方法,一类方法是buildPartX(),用于创建复杂对象的各个部件。另一类方法是getResult(),用于返回复杂对象。
2、ConcreteBuilder(具体建造者)
该类实现Builder接口,实现各个部件的构造和装配方式,定义并明确所创造的复杂对象。也提供一个方法返回创造好的复杂对象。
3、Product(产品角色)
产品角色是被构建的复杂对象,它包含多个组成部件,具体建造者创建并定义产品属性。
4、Director(指挥者)
负责安排复杂对象的建造次序,客户端一般只需要与指挥者进行交互,
优点:
(1)客户端不必知道产品内部组成的细节,将产品本身和产品的创建过程进行解耦,使得相同的创建过程可以创建不同的对象。
(2)每一个具体的创建者相对独立
(3)可以更加精细的控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更清晰。
(4)符合“开闭原则”,增加具体创建者,无需修改类库的代码。
缺点:
(1)建造者模式创建的产品一般具有较多的共同点,其组成部分相似,使用范围受限。
(2)如果产品内部变化复杂,可能导致需要定义很多具体创建者类,导致系统变得很庞大。
KFC案例
Meal实体类
package com.zck.builder; public class Meal { private String food; private String drink; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } }
MealBuilder接口类
package com.zck.builder; public abstract class MealBuilder { protected Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); public Meal getMeal(){ return meal; } }
MeaBuilderA A套餐类
package com.zck.builder; public class MealBuilderA extends MealBuilder { public void buildFood() { meal.setFood("鸡腿堡"); } public void buildDrink() { meal.setDrink("可乐"); } }
MealBuilderB B套餐类
package com.zck.builder; public class MealBuilderB extends MealBuilder { public void buildFood() { meal.setFood("汉堡"); } public void buildDrink() { meal.setDrink("果汁"); } }
Director 指挥类
package com.zck.builder; public class Director { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mealBuilder) { this.mealBuilder = mealBuilder; } public Meal construct(){ mealBuilder.buildFood(); mealBuilder.buildDrink(); return mealBuilder.getMeal(); } }
Client 客户端类
package com.zck.builder; public class Client { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilderA(); Director director = new Director(); director.setMealBuilder(mealBuilder); Meal meal = director.construct(); System.out.print(meal.getFood()+"+"+meal.getDrink()); } }
测试结果