版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxcaifly/article/details/85245092
1.建造者模式定义
建造者模式,顾名思义的就是类似建房子,有一个固定的流程。在大话设计模式中,作者举了一个例子大概意思是同一道菜在中国的每一个地方都有不同的味道(LZ印象最深的是酸菜鱼,来杭州之后印象最深刻的是清蒸鲈鱼。),而肯德基的鸡腿、汉堡在每一个城市都是一样的味道。建造者模式实现了依赖倒转原则,抽象不应该依赖细节,细节应该依赖与抽象。建造者模式的定义是:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
2.建造者模式的4个角色
建造者模式的角色定义,在建造者模式中存在以下4个角色:
- builder:为创建一个产品对象的各个部件指定抽象接口。
- ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
3.建造者模式UML图
4.建造者模式代码
建造者模式我们就以建房子这一个工程为例子写程序吧。这一过程为打桩建立基础、砌墙、封顶。不管是普通房子也好,别墅也好都需要经历这一过程,符合我们的建设。
具体的产品Product:
package com.roc.build;
/**
* 具体的产品---房子
* @author liaowp
*
*/
public class Product {
private String basic;//地基
private String walls;//墙
private String roofed;//楼顶
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWalls() {
return walls;
}
public void setWall(String walls) {
this.walls = walls;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
抽象Builder建造:
package com.roc.build;
/**
* 抽象建造
* @author liaowp
*
*/
public interface Builder {
/**
* 打基础
*/
public void buildBasic();
/**
* 砌墙
*/
public void buildWalls();
/**
* 封顶
*/
public void roofed();
/**
* 造房子
* @return
*/
public Product buildProduct();
}
具体的ConcreteBuilder建造:
package com.roc.build;
/**
* 具体的建造
* @author liaowp
*
*/
public class ConcreteBuilder implements Builder{
private Product product;
public ConcreteBuilder(){
product=new Product();
}
@Override
public void buildBasic() {
product.setBasic("打好基础");
}
@Override
public void buildWalls() {
product.setWalls("砌墙");
}
@Override
public void roofed() {
product.setRoofed("封顶大吉");
}
@Override
public Product buildProduct() {
return product;
}
}
建造者:
package com.roc.build;
/**
* 建造者
* @author liaowp
*
*/
public class Director {
public Product constructProduct(ConcreteBuilder concreteBuilder){
concreteBuilder.buildBasic();
concreteBuilder.buildWalls();
concreteBuilder.roofed();
return concreteBuilder.buildProduct();
}
}
测试类:
package com.roc.build;
/**
* 建造者
* @author liaowp
* */
public class Director {
public static void main(String[] args){
ConcreteBuilder concreteBuilder = new ConreteBuilder();
Product product = new Director().constructProduct(concreteBuilder);
System.out.println(product.getBasic());
System.out.println(product.getWalls());
System.out.println(product.getRoofted());
}
}
5.建造者模式优缺点
优点
- 易于解耦:将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
- 易于精确控制对象的创建:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
- 易于拓展:增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
6.应用场景
- 需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。