建造者模式

建造者模式(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电视

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

......,欢迎指正

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值