建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
JAVA 中的 StringBuilder就是使用了建造者模式。
建造者(Builder)模式的应用场景:
1.创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
2.创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。
建造者(Builder)模式的主要角色如下:
1.产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
2.抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
3.具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
4.指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
实现:
1.产品角色
package builder;
/**
*
* @ClassName: Home
* @Description: 房子:产品对象(不变)
* @author: ljx
* @date: 2018年12月27日 下午4:24:29
*/
public class Home {
public String shafa;//沙发
public String TV;//电视
public String teaTable;//茶几
public String getShafa() {
return shafa;
}
public void setShafa(String shafa) {
this.shafa = shafa;
}
public String getTV() {
return TV;
}
public void setTV(String tV) {
TV = tV;
}
public String getTeaTable() {
return teaTable;
}
public void setTeaTable(String teaTable) {
this.teaTable = teaTable;
}
public void show(){
System.out.println("房子的组成:");
}
}
2.抽象建造者
package builder;
/**
*
* @ClassName: HomeBuilder
* @Description: 抽象建造者
* @author: ljx
* @date: 2018年12月27日 下午4:51:51
*/
public abstract class HomeBuilder {
//创建产品对象
public Home home = new Home();
//产品沙发建造方法
public abstract void shafa();
//产品电视建造方法
public abstract void TV();
//产品茶几建造方法
public abstract void teaTable();
//返回产品的方法
public Home getHome() {
return home;
}
}
3.具体建造者
package builder;
/**
*
* @ClassName: ConcreteHomeBuilder
* @Description: 具体建造者(变)
* @author: ljx
* @date: 2018年12月27日 下午4:58:20
*/
public class ConcreteHomeBuilder extends HomeBuilder{
@Override
public void shafa() {
home.setShafa("真皮沙发");
}
@Override
public void TV() {
home.setTV("4k电视");
}
@Override
public void teaTable() {
home.setTeaTable("红木茶几");
}
}
4.指挥者
package builder;
/**
*
* @ClassName: Director
* @Description: 导演类:指挥摆放者(如何变)
* @author: ljx
* @date: 2018年12月27日 下午5:03:08
*/
public class Director {
//获取当前建造者的指挥权
public HomeBuilder homeBuilder;
//构造方法,直接获取建造者对象
public Director(HomeBuilder homeBuilder){
this.homeBuilder = homeBuilder;
}
//指挥摆放
public Home construct(){
homeBuilder.teaTable();
homeBuilder.shafa();
homeBuilder.TV();
return homeBuilder.getHome();
}
}
测试:
package builder;
/**
*
* @ClassName: Test
* @Description: 测试
* @author: ljx
* @date: 2018年12月27日 下午5:11:00
*/
public class Test {
public static void main(String[] args) {
//创建建造者
HomeBuilder builder = new ConcreteHomeBuilder();
//导演者
Director director = new Director(builder);
//摆放命令
Home home = director.construct();
home.show();
System.out.println(home.shafa);
System.out.println(home.teaTable);
System.out.println(home.TV);
}
}
结果:
房子的组成:
真皮沙发
红木茶几
4k电视
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
......,欢迎指正