23种设计模式----建造者模式----创建型模式

版权声明:本文为博主原创文章,转载请注明作者。 https://blog.csdn.net/a18792721831/article/details/83538512

1.建造者模式解决的问题

当我们处理比较复杂的问题时,很难一次性的解决,或者当问题比较复杂,一次性难以完成时。
建造者模式提供一个在原基础上不断扩充的模式,我们可以在上次的基础上增加一些的新的内容。
最终,完成较为复杂的需要。
建造者模式不断扩充。
另一种理解:
看书上的意思应该是同一个流程实现不同的产品,其实我个人觉得,这里和模板方法以及工厂模式等等非常的类似。


注意:本文所写可能与大多数其他的建造者解释有所不同,请注意。

2.建造者模式中的角色

1.建造:接口类型,主要定义了建造者最核心的,必须实现的方法。
2.工头:建造接口的使用者,主要作用就是协调建造接口中核心方法的调用
3.建造者:建造接口的扩充类或者上一个建造者的继承类。

3.建造者模式的调用过程

1.在测试类中调用工头的建造方法
2.在工头的建造方法中会要求传入一个建造者
3.按照工头方法中的顺序调用建造者的建造方法

4建造者实例

4.1角色说明

建造接口:
Bulid
建造者:
Bulider#
(#代表建造者的标识,比如Bulider1,Bulider2…)
工头:
Headman
工具:
OutUtil

4.2建造接口:

public interface Build {

	void startBulid(String string);
	
	void buliding(String string);
	
	void endBulid(String string);
	
}

4.3工头

public class Headman {

	private static final Headman headman = new Headman();
	
	private Headman(){
		
	}
	
	public static Headman getHeadman(){
		return headman;
	}
	
	public void doBulid(Build build){
		build.startBulid("start");
		build.buliding("doing");
		build.endBulid("ended");
	}
	
}

4.4建造者1

public class Bulider1 implements Build{

	@Override
	public void startBulid(String string) {
		OutUtil.say(string);
		OutUtil.say("Bulider1");
	}

	@Override
	public void buliding(String string) {
		OutUtil.say(string);
		OutUtil.say("Bulider1");
	}

	@Override
	public void endBulid(String string) {
		OutUtil.say(string);
		OutUtil.say("Bulider1");
	}

}

4.5建造者2

public class Bulider2 extends Bulider1{

	@Override
	public void startBulid(String string){
		super.startBulid(string);
		OutUtil.say(string);
		OutUtil.say("Bulider2");
	}
	
	@Override
	public void buliding(String string){
		super.buliding(string);
		OutUtil.say(string);
		OutUtil.say("Bulider2");
	}
	
	@Override
	public void endBulid(String string){
		super.endBulid(string);
		OutUtil.say(string);
		OutUtil.say("Bulider2");
	}
}


4.6建造者3

public class Bulider3 extends Bulider2{

	@Override
	public void startBulid(String string){
		super.startBulid(string);
		OutUtil.say(string);
		OutUtil.say("Bulider3");
	}
	
	@Override
	public void buliding(String string){
		super.buliding(string);
		OutUtil.say(string);
		OutUtil.say("Bulider3");
	}
	
	@Override
	public void endBulid(String string){
		super.endBulid(string);
		OutUtil.say(string);
		OutUtil.say("Bulider3");
	}
	
}


4.7工具类

public class OutUtil {

	public static void say(String string){
		System.out.println("---------------------"+string+"--------------------------");
	} 
	
}

4.8测试方法

public class Main {

	public static void main(String[] args) {
		OutUtil.say("这是bulider1");
		Headman.getHeadman().doBulid(new Bulider1());
		System.out.println();
		System.out.println();
		OutUtil.say("这是bulider2");
		Headman.getHeadman().doBulid(new Bulider2());
		System.out.println();
		System.out.println();
		OutUtil.say("这是bulider3");
		Headman.getHeadman().doBulid(new Bulider3());
	}

}

5测试结果

---------------------这是bulider1--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------


---------------------这是bulider2--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------start--------------------------
---------------------Bulider2--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider2--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider2--------------------------


---------------------这是bulider3--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------start--------------------------
---------------------Bulider2--------------------------
---------------------start--------------------------
---------------------Bulider3--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider2--------------------------
---------------------doing--------------------------
---------------------Bulider3--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider2--------------------------
---------------------ended--------------------------
---------------------Bulider3--------------------------


6.总结

我们发现建造者模式中有意思的一点:


不管你的建造者怎么变,建造者模式中的工头是不变的,而且,我们在测试方法中使用建造者,并不是直接使用的,而是通过工头的建造方法来使用建造者的开始进行结束方法的。
所以,我们就可以把现在完成的项目打包,等到有新的需要时,继承建造者或者实现接口,就可以在原有的基础上修改。
同时,使用建造者模式,避免了一种情况。当我们需要扩充方法时,无需打开我们原有的方法的源代码,因为没有任何对原有建造者源代码的直接操作,所以,使用建造者模式扩充时,原有的建造者可以保证其完整性和正确性。

猜你喜欢

转载自blog.csdn.net/a18792721831/article/details/83538512