建造者模式

1 介绍


Builder模式是一种对象创建型模式。主要用来隐藏复合对象的创建过程,复合对象的创建抽象出来,通过子类继承或重载的方式,动态的创建复合对象。

建造者模式的几个角色

  • Builder:抽象建造者 --- Product中各个复合对象的接口
  • ConcreateBuidler:具体建造者 --- 实现抽象接口并加以实现
  • Director:指挥者
  • Product:产品角色 --- 一个具体的产品对象

先举个例子来理解下几个角色的意思:
<a>当我们去吃kfc时,我们需要先告诉服务员(Director)我们需要点什么套餐(ConcreateBuilder),然后厨房(Builder)再根据套餐去选择合适的单品(Product。</a>

2 实现


产品角色:Product.class

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;
    }
    @Override
    public String toString() {
        return "Meal [food=" + food + ", drink=" + drink + "]";
    }   
}

抽象建造者:Kitchen.class


public interface Kitchen {
    void makeFood();
    void makeDrink();
    Meal getMeal();
}

具体建造者:MealA.class/MealB.class

public class MealA implements Kitchen{
    Meal meal = new Meal();
    @Override
    public void makeFood() {
        meal.setFood("套餐A--生产食物");
    }

    @Override
    public void makeDrink() {
        meal.setDrink("套餐A--生产饮料");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
    
}
public class MealB implements Kitchen{
    Meal meal = new Meal();
    @Override
    public void makeFood() {
        meal.setFood("套餐B--生产食物");
    }

    @Override
    public void makeDrink() {
        meal.setDrink("套餐B--生产饮料");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
    
}

指挥者:Waiter.class

public class Waiter {
    private Kitchen kitchen;
    public Waiter (Kitchen kitchen) {
        this.kitchen = kitchen;
    }
    
    public Kitchen getMeal(){
        kitchen.makeFood();
        kitchen.makeDrink();
        return kitchen;
    }
}

测试:MainClass.class

public class MainClass {
    public static void main(String[] args) {
        
        Kitchen meal = new MealA();
        Waiter waiter = new Waiter(meal);
        waiter.getMeal();
        Meal meal2 = meal.getMeal();
        System.out.println(meal2.toString());

    }
}
运行结果

3 优缺点


优点:

  • 将产品的创建过程与产品本身分离出来,可以根据相同的创建过程得到不同的产品。
  • 将复杂的产品创建过程进行分解,让整个创建过程增次化,这样可以让开发人员更加方便的进行操控。

缺点

  • 如果产品的的内部结构很复杂,可能会导致需要定义很多的具体建造者来实现这些变化,导致代码量过多。

上一篇:原型模式
下一篇:装饰模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容