(六)设计模式六之建造者模式

前言:

 参考图书:软件设计模式与体系结构

参考博客:(1)http://www.runoob.com/design-pattern/builder-pattern.html

                  (2)https://www.cnblogs.com/wanson/articles/9277813.html

                  (3)https://blog.csdn.net/carson_ho/article/details/54910597


开始:

生成器模式与工厂方法模式有相似之处,因为两者都属于创建型模式!大家开始可能会绝得两者差不多,但是将代码写完以后就会发现

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

UML如下

 产品:宝马

package cn.gxm.Builder;

/**
 * 需要生产的宝马
 * 现在只是一个空的框架
 * @author xiaomi
 *
 */
public class Product {
	
	private String light;//车灯
    private String engine;//引擎
    private String tire;//轮胎
	public String getLight() {
		return light;
	}
	public void setLight(String light) {
		this.light = light;
	}
	public String getEngine() {
		return engine;
	}
	public void setEngine(String engine) {
		this.engine = engine;
	}
	public String getTire() {
		return tire;
	}
	public void setTire(String tire) {
		this.tire = tire;
	}
	public Product(String light, String engine, String tire) {
		super();
		this.light = light;
		this.engine = engine;
		this.tire = tire;
	}
	@Override
	public String toString() {
		return "Product [light=" + light + ", engine=" + engine + ", tire=" + tire + "]";
	}
	
	public Product() {
	}
}

 工人师傅:接口

package cn.gxm.Builder;

/**
 * 建造宝马的各个部件(接口)
 * 工人师傅
 * @author xiaomi
 *
 */
public interface Builder {
	
	
	//需要一个宝马的框架,然后构造师向里面添加部件
	public Product product = new Product();
		
	
	//构造车灯
	public void createLight();
	
	//构造引擎
	public void createEngine();
	
	//构造轮胎
	public void createTire();
	
	//将组装好的宝马,准备好!谁要就给谁
	public Product getProduct();
}

正真的工人师傅:类

package cn.gxm.Builder;

/**
 * 建造各个部件
 * @author xiaomi
 *
 */
public class ConcreteBuilder implements Builder{
	
	@Override
	public void createLight() {
		product.setLight("高档车灯");
	}

	@Override
	public void createEngine() {
		product.setEngine("高档引擎");
	}

	@Override
	public void createTire() {
		product.setTire("高档轮胎");
	}
	
	@Override
	public Product getProduct() {
		return product;
	}

}

 组装人员(指挥者)

package cn.gxm.Builder;

/**
 * 使用builder向product中组装
 * 
 * @author xiaomi
 *
 */
public class Director {
	
	private Builder builder;
	
	//老板需要组装人员把装好的宝马拿来
	public Director(Builder builder) {
		this.builder = builder;
	}
	
	//老板使用工人师傅带来的宝马配件组装成一个宝马,给客人看
	public Product Show() {
		builder.createEngine();
		builder.createLight();
		builder.createTire();
		return builder.getProduct();
	}
	
}

 客人来买宝马

package cn.gxm.Builder;

public class Client {

	public static void main(String[] args) {
		
		//客人先找老板(但是老板就是指挥者)
		//但是指挥者并没有宝马配件,所以找来了造宝马各个部件的工人师傅
		Builder builder = new ConcreteBuilder();
		
		//指挥者(老板)指挥工人师傅把宝马的各个零件给装配成一个完整的宝马!
		Director director = new Director(builder);
		
		//老板弄好的宝马给客人看
		Product product = director.Show();
		System.out.println(product.toString());
	}
}

写完的那么一瞬间,感觉好像和工厂模式似曾相识,但大家再仔细想一下  建造者模式更加关注与零件装配的顺序。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点:  1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景:  1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖

猜你喜欢

转载自blog.csdn.net/qq_38263083/article/details/84572526