建造者模式

Posted xiaojiesir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

实例:KFC套餐

建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。

 技术图片

1)Product(产品角色)

一个具体的产品对象。

 1 public class Meal 
 2     private String food;
 3     private String drink;
 4 
 5     public String getFood() 
 6         return food;
 7     
 8 
 9     public void setFood(String food) 
10         this.food = food;
11     
12 
13     public String getDrink() 
14         return drink;
15     
16 
17     public void setDrink(String drink) 
18         this.drink = drink;
19     
20 

2)Builder(抽象建造者)

创建一个Product对象的各个部件指定的抽象接口。

 1 public abstract class MealBuilder 
 2     Meal meal = new Meal();
 3     
 4     public abstract void buildFood();
 5     
 6     public abstract void buildDrink();
 7     
 8     public Meal getMeal()
 9         return meal;
10     
11 

3) ConcreteBuilder(具体建造者)

实现抽象接口,构建和装配各个部件。

A套餐:

 1 public class MealA extends MealBuilder
 2 
 3     public void buildDrink() 
 4         meal.setDrink("可乐");
 5     
 6 
 7     public void buildFood() 
 8         meal.setFood("薯条");
 9     
10 
11 

B套餐:

 1 public class MealB extends MealBuilder
 2 
 3     public void buildDrink() 
 4         meal.setDrink("柠檬果汁");
 5     
 6 
 7     public void buildFood() 
 8         meal.setFood("鸡翅");
 9     
10 
11 

4)Director(指挥者)

构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

 1 public class KFCWaiter 
 2     private MealBuilder mealBuilder;
 3     
 4     public KFCWaiter(MealBuilder mealBuilder) 
 5         this.mealBuilder = mealBuilder;
 6     
 7     
 8 
 9     public Meal construct()
10         //准备食物
11         mealBuilder.buildFood();
12         //准备饮料
13         mealBuilder.buildDrink();
14         
15         //准备完毕,返回一个完整的套餐给客户
16         return mealBuilder.getMeal();
17     
18 

5)测试类(客户端类)

 1 public class Test 
 2     public static void main(String[] args) 
 3 
 4         //套餐A
 5         MealA a = new MealA();
 6         //准备套餐A的服务员
 7         KFCWaiter waiter = new KFCWaiter(a);
 8         //获得套餐
 9         Meal mealA = waiter.construct();      
10         System.out.print("套餐A的组成部分:");
11         System.out.println("食物:"+mealA.getFood()+";   "+"饮品:"+mealA.getDrink());
12     
13 

输出结果:

套餐A的组成部分:食物:薯条;   饮品:可乐

建造者模式与抽象工厂模式的比较:

  • 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
  • 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
  • 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。

 

以上是关于建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式·建造者模式

设计模式之建造者模式(创建型)

《大话设计模式》——建造者模式

建造者模式(Builder Pattern)

设计模式—建造者模式(Builder)

什么是建造者模式