导读:建造者模式.一、模式动机.建造者模式(Builder Pattern)是最复杂的创建型模式,它用于创建一个包含多个组成部分的复杂对象.,可以返回一个完整的产品对象给用户。它通过将客户端与包含多个组成部分的复杂对象的创建过程分离.,使得客户端无需知道复杂对象的内部组成部分与装配方式
建造者模式(Builder Pattern)是最复杂的创建型模式,它用于创建一个包含多个组成部分的复杂对象 ,可以返回一个完整的产品对象给用户。它通过将客户端与包含多个组成部分的复杂对象的创建过程分离 ,使得客户端无需知道复杂对象的内部组成部分与装配方式,只需要知道建造者的类型即可 。它关注如何一步一步创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,系统具有较好的扩展性。
产品:一个由多种组件组合生成的复杂对象
public class Product {
private String partA; //定义部件,部件可以是任意类型,包括值类型和引用类型
private String partB;
private String partC;
//partA的Getter方法和Setter方法省略
//partB的Getter方法和Setter方法省略
//partC的Getter方法和Setter方法省略
}
抽象建造者
public abstract class Builder {
//创建产品对象
protected Product product=new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult() {
return product;
}
}
具体建造者
public class ConcreteBuilder1 extends Builder{
public void buildPartA() {
product.setPartA("A1");
}
public void buildPartB() {
product.setPartB("B1");
}
public void buildPartC() {
product.setPartC("C1");
}
}
指挥者
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder=builder;
}
public void setBuilder(Builder builder) {
this.builder=builer;
}
//产品构建与组装方法
public Product construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
客户
......
Builder builder = new ConcreteBuilder1(); //可通过配置文件实现
Director director = new Director(builder);
Product product = director.construct();
......
每一份套餐都是由不同的food和drink组成
Meal
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
public abstract class MealBuilder {
protected Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal() {
return meal;
}
}
具体建造者A
public class MealBuilderA extends MealBuilder{
@Override
public void buildFood() {
this.meal.setFood("AFood");
}
@Override
public void buildDrink() {
this.meal.setDrink("ADrink");
}
}
具体建造者B
public class MealBuilderB extends MealBuilder{
@Override
public void buildFood() {
this.meal.setFood("BFood");
}
@Override
public void buildDrink() {
this.meal.setDrink("BDrink");
}
}
指挥者类
public class Director {
private MealBuilder mb;
public void setMb(MealBuilder mb) {
this.mb = mb;
}
public Meal construct(){
mb.buildFood();
mb.buildDrink();
return mb.getMeal();
}
}
客户类
public class Client {
public static void main(String[] args) {
MealBuilderA mbA = new MealBuilderA();//选择套餐
Director director = new Director();//叫服务员
director.setMb(mbA);//告知服务员
Meal meal = director.construct();//服务员上套餐
System.out.println("套餐A:");
System.out.println(meal.getFood());
System.out.println(meal.getDrink());
}
}
在一个复杂对象由很多复杂的属性组成,不同的属性组成不同的复杂对象,建造者使用setter注入不同的属性,指挥者包含建造者,在指挥者内调用建造者方法获取复杂对象
上一篇:Git下载、安装与配置
下一篇:一年365天都很快乐,原来快乐如