设计模式之建造者模式

建造者模式--导读

  生活中我们经常碰到,餐馆中各种不同的套餐,和各种不同的汽车,但是这些都有一个共同的特性,那就是他们多是由各种部件组成。

就比如在kfc点餐一样,他给你提供很多不同的组合,比如说薯条和饮料和汉堡,薯条和果汁和烤翅,你会发现这些单个的东西都会单买,但是

跟据不同的组合,就形成了五花八门的套餐,这就用到了我们的建造者模式了,用户仅需知道这个套餐是什么,而不需要知道套餐中的具体组合

便可以得到自己想要的套餐,不需要管这其中复杂的组合关系

建造者模式--定义

  建造者模式将一个复杂对象的构建过程和表是分开,是的同样的创建过程,通过不同的组合过程可以创建出不同的表示 。

  建造者模式构建复杂对象就像造汽车一样,是一个一个组件一个一个步骤创建出来的,它允许用户通过制定的对象类型和内容来创建他们,但是用户并不需要知道这个复杂对象是如何构建的,它只需要明白通过这样做我可以得到一个完整的复杂对象实例

建造者模式--模式结构

  一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式的本质是使组装过程(用指挥者类进行封装,从而达到解耦的目的)和创建具体产品解耦,使我们不用去关心每个组件是如何组装的。

建造者模式的实现:

①在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。

②建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。

③产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。

④在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。

⑤由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。

建造者模式--具体实现

 

package Builder_Pattern;
/**
 * 为创建具体产品提供具体建构者提供接口
 * @author liu
 *
 */
public abstract class CarBuilder {
    public Car car=new Car();public  abstract void createTyer();
    public abstract void createSeats();
    public abstract void createEngine();
    public Car getCar() {
        return car;
    }
}
Car.java
package Builder_Pattern;

public class Car {
    private String tyer;
    private String seats;
    private String engine;
    @Override
    public String toString() {
        return "Car [tyer=" + tyer + ", seats=" + seats + ", engine=" + engine + "]";
    }
    public String getTyer() {
        return tyer;
    }
    public void setTyer(String tyer) {
        this.tyer = tyer;
    }
    public String getSeats() {
        return seats;
    }
    public void setSeats(String seats) {
        this.seats = seats;
    }
    public String getEngine() {
        return engine;
    }
    public void setEngine(String engine) {
        this.engine = engine;
    }
    
}
package Builder_Pattern;

public class CheaperCarBuilder extends CarBuilder{

  @Override
  public void createTyer() {
    this.car.setTyer("垃圾的轮胎");

  }

  @Override
  public void createSeats() {
    this.car.setSeats("垃圾的座位");

  }

  @Override
  public void createEngine() {
  // TODO Auto-generated method stub
  this.car.setEngine("垃圾的发动机");
  }

}

 

package Builder_Pattern;
/**
 * 指挥者通过调用build接口来实现创建客户所需的
 * 对象,从而实现客户端与创建过程的解耦
 * @author liu
 *
 */
public class Director {
    CarBuilder builder;
    public Director(CarBuilder builder) {
        this.builder=builder;
    }
    public Car construct() {
        builder.createEngine();
        builder.createSeats();
        builder.createTyer();
        return builder.getCar();
    }
}

 

package Builder_Pattern;

public class client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //客户端不需要接触具体的创建过程
        CheaperCarBuilder builder=new CheaperCarBuilder();
        Director director=new Director(builder);
        Car car=director.construct();

      System.out.println(car.toString());


    }

}

建造者模式--优缺点

  1、将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。

      2、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。

      3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

缺点

      1、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
      2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

建造者模式--使用场景

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

   2、JAVA 中的 StringBuilder。

 

posted @ 2019-04-03 23:58  繁声物语  阅读(275)  评论(0编辑  收藏  举报