设计模式(5)---建造者模式

陌路散爱 提交于 2020-01-25 08:47:33

在这里插入图片描述

上一篇:抽象工厂模式

1.什么是建造者模式?

   将一个复杂对象的构建和表示分离开,使得同样的构建可以创建不同的表示。

整不明白?
   你就想象一下你点外卖的时候有不同的套餐:可乐+炸鸡=套餐A,可乐+薯条=套餐B。套餐A和套餐B是两个不同的表示,它的构建就是可乐、炸鸡、薯条这些子对象,这些子对象是不变的,但是能够通过不同的组合生成不同的套餐。

   还没有懂?

   造房子!造房子你用的原材料无非就是钢筋、水泥之类的材料(构建子对象),但是最终造出来的房子(表示)却是不一样的。

2.建造者模式的作用?

   建造者模式用来隐藏复杂对象的实现细节,将复杂对象的创建进行抽象化,通过子类继承和重载的方式动态创建复杂对象。

3.如何使用建造者模式?

1)定义房子类
/**
 * 定义 房子类
 */
public class House {

	/**
	 * 钢筋
	 */
	private String rebar;

	/**
	 * 水泥
	 */
	private String cement;

	public String getRebar() {
		return rebar;
	}

	public void setRebar(String rebar) {
		this.rebar = rebar;
	}

	public String getCement() {
		return cement;
	}

	public void setCement(String cement) {
		this.cement = cement;
	}

	@Override
	public String toString() {
		return "House{" +
				"rebar='" + rebar + '\'' +
				", cement='" + cement + '\'' +
				'}';
	}
}
2)定义建造者接口(工人)
/**
 * 定义建造者(工人)
 */
public interface HouseBuilder {

	/**
	 * 加钢筋
	 */
	public void addRebar();

	/**
	 * 加水泥
	 */
	public void addCement();

	/**
	 * 获取房子对象
	 */
	public House getHouse();

}
3)定义造高楼的施工队
/**
 * 定义造高楼施工队类
 */
public class TallBuilder implements HouseBuilder {

	House house = new House();


	@Override
	public void addRebar() {
		house.setRebar("高楼---专用钢筋");
	}

	@Override
	public void addCement() {
		house.setCement("高楼---专用水泥");
	}

	@Override
	public House getHouse() {
		return house;
	}
}
4)定义工地总指挥

  建造者模式工厂模式的区别就在于:建造者模式更加专注于零件的装配顺序(先加钢筋还是先加水泥)。这里的工地总指挥类就是用来定义零件装配顺序的,总指挥让你先加水泥就先加水泥,先放钢筋就先放钢筋。


/**
 * 定义 指挥者 类
 */
public class Directer {

	public House build(HouseBuilder houseBuilder) {
		//加钢筋
		houseBuilder.addRebar();
		//加水泥
		houseBuilder.addCement();
		//返回一个hosue对象
		House house = houseBuilder.getHouse();
		return house;
	}
}
5)编写测试类
/**
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		//1.先new一个工地总指挥
		Directer directer = new Directer();
		//2.工地总指挥让修高楼(高楼施工队开始造房子)
		House tallHouse = directer.build(new TallBuilder());
		//3.打印输出
		System.out.println(tallHouse);
		System.out.println("========================");

		//4.工地总指挥让修矮楼(矮楼施工队开始造房子)
		House shortHouse = directer.build(new ShortBuilder());
		//打印输出
		System.out.println(shortHouse);
	}
}

5)打印输出结果

在这里插入图片描述
  看到测试类的时候,大家应该就已经知道建造者模式和我们普通获取对象的方式的区别了,要是普通方式,我们会直接在main()方法中new 一个house对象,然后给它set值。而现在我们使用建造者模式时反正还是用钢筋水泥,但是最终的成品却不一样。

3.建造者模式的优越点?

1)优点:

  具体的建造者是相互独立的(矮楼施工队、高楼施工队),便于横向扩展(再加个别墅施工队就直接添加新的实现类就行了)。

2)缺点:

  此种模式所创建的产品一般都有很多的相同点,如果不同点太多,则此种模式就不适用了,其使用范围受到一定的限制。

  如果产品的内部变化很大,则可能需要定义很多的建造者类来实现这种变化,可能导致系统过于庞大。

下一篇:原型模式

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!