设计模式之建造者模式
建造者模式--导读
生活中我们经常碰到,餐馆中各种不同的套餐,和各种不同的汽车,但是这些都有一个共同的特性,那就是他们多是由各种部件组成。
就比如在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。