建造者模式
(将一个 复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)
建造者模式是一种创建型的模式,有一些对象的创建过程new 是很繁杂的。
什么时候去使用建造者模式
由上文可以得出在一些对象创建非常繁杂的场景就可以使用建造者模式。指定创建顺序以免出错。
还有一种场景。可能产品细节会改变。比如升级了第二代。这时候只需要重新定义一个具体的建造者就可以了。方便于扩展。
建造者模式与工厂模式的不同:
建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了, 顺序不同产生的对象也不同; 工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。
@Builder 注解用了建造者模式。
代码:
1 . 建造对象
/**
* 肯德基的套餐(fond+drink)
* @author WHM
*
*/
public class Product {
private String food;
private String drink;
public String getFood() {
return food;
}
public String getDrink() {
return drink;
}
public void setFood(String food) {
this.food = food;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
2 产品扩展
public class MealA extends MealBuilder{
@Override
public void buildFood() {
pro.setFood("牛肉汉堡");
}
@Override
public void buildDrink() {
pro.setDrink("可口可乐");
}
}
public class MealB extends MealBuilder{
@Override
public void buildFood() {
pro.setFood("鸡翅鸡腿");
}
@Override
public void buildDrink() {
pro.setDrink("牛奶");
}
}
3 抽象建造者,用于扩展
/**
* 抽象建造者,用于扩展
* @author WHM
*
*/
public abstract class MealBuilder {
Product pro = new Product();
public abstract void buildFood();
public abstract void buildDrink();
public Product getProcdut() {
return pro;
}
}
4 建造类
/**
* 指挥生产套餐
*
* @author WHM
*
*/
public class MealDirector {
private MealBuilder mealBuilder;
//传入构造器中
public MealDirector(MealBuilder mealBuilder) {
this.mealBuilder = mealBuilder;
}
public Product combine() {
mealBuilder.buildDrink();
mealBuilder.buildFood();
return mealBuilder.getProcdut();
}
}
5 测试
package pattern.builder;
/**
* 1.建造者是对一个复杂对象的分解. 2.1抽象工厂模式实现对产品家族的创建:具有不同分类维度的产品组合;
* 2.2它的主要目的是通过组装零配件而产生一个新产品 3.Product(产品角色):一个具体的产品对象(分解)。
* Builder(抽象建造者):创建一个Product对象的各个分解部件指定的抽象接口。
* ConcreteBuilder(具体建造者):实现抽象接口,构建和装配各个部件。 Director(指挥者):构建一个使用Builder接口的对象,松偶。
*
* 4.用户只需要传入我想生产的套餐,并不需要关心套餐生产过程
* @author WHM
*
*/
public class TMain {
public static void main(String[] args) {
// 套餐A
MealA a = new MealA();
// 准备套餐A的服务员
MealDirector waiter = new MealDirector(a);
// 获得套餐
Product mealA = waiter.combine();
System.out.print("套餐A的组成部分:");
System.out.println("食物:" + mealA.getFood() + "; " + "饮品:" + mealA.getDrink());
}
}
引入
import lombok.Builder;
获取对象就可以用builder,不在是new,如果10几个直接设置属性值就行。