package builderPattern;

/*
 * 画一个小人
 */
public class Commonly {
	public static void main(String[] args) {
			Person person = new Person();
			System.out.println("画一个小人:");
			person.drawHand("小头");
			person.drawHand("大手");
			person.drawFoot("大脚");
			
			//再画一个小人
			System.out.println("再画一个小人:");
			person.drawHand("大头");
			person.drawHand("小手");
			//对  没错忘了画脚了
	}
}

/*
 * 人 类  可以画 头  手   脚 
 */
class Person{
	/*
	 * 画头
	 */
	public void drawHead(String head){
		System.out.println(head);
	}
	/*
	 * 画手
	 */
	public void drawHand(String hand){
		System.out.println(hand);
	}
	/*
	 * 画脚
	 */
	public void drawFoot(String foot){
		System.out.println(foot);
	}
	
}



package builderPattern;
/**
 * 建造者模式:
 * 讲一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标示
 * 
 *@author LiMing  E-mail:1151143484@qq.com
 *@date 2017年6月17日  上午10:50:30
 */
public class BuilderPattern {
	public static void main(String[] args) {
		PersonSmallBuilder builder = new PersonSmallBuilder();
		PersonBigBuilder bigBuilder = new PersonBigBuilder();
		Director director = new Director(builder);
		Director director2 = new Director(bigBuilder);
		System.out.println("建造小人1:");
		director.CreatPerson();
		System.out.println("建造小人2:");
		director2.CreatPerson();
		
		/**
		 * 总结:
		 * PersonsBuilder是什么?
		 * 	PersonsBuilder是对各个部件指定的抽象接口 
		 * PersonSmallBuilder是什么?
		 * 	PersonSmallBuilder是具体的构建者 实现PersonsBuilder接口 构造和装配各个部件
		 * Director是什么 ?
		 * 	Director是指挥者 根据用户需求构造产品(根据用户构造方法中传入的Builder具体类的类别)
		 * 什么时候使用建造者模式?
		 * 	主要用于创建一些复杂的对象,这些对象内部构建的建造顺序通常是稳定的,但对象内部的构建通常是面临着复杂的变化
		 * 	比如构造小人 每次构造只需要画头-画手-画脚  这几个步骤是固定不变的 但是 画头的时候有大有小有胖有瘦 这个事复杂变化的
		 * 	所以需要用构建者模式  用户只需要实现builder类的接口 做具体的实现 然后调用指挥者来进行创建
		 */
	}
} 


/*
 * 抽象的建造人类
 */
abstract class  PersonsBuilder{
	public abstract void  drawHead();
	public abstract void  drawHand();
	public abstract void  drawFoot();
}

/*
 * 具体的实现类 画各种人物
 */
class PersonSmallBuilder extends PersonsBuilder{

	public void drawHead() {
		System.out.println("大头");
	}

	@Override
	public void drawHand() {
		System.out.println("小手");
	}

	@Override
	public void drawFoot() {
		System.out.println("小脚");
	}
	
}
class PersonBigBuilder extends PersonsBuilder{

	public void drawHead() {
		System.out.println("小头");
	}

	@Override
	public void drawHand() {
		System.out.println("大手");
	}

	@Override
	public void drawFoot() {
		System.out.println("大脚");
	}
	
}

/*
 * 最重要的类 隆重登场!!!  没错 就是他  指挥者
 */

class Director{
	private PersonsBuilder builder;
	public Director(PersonsBuilder builder){
		this.builder = builder;
	}
	
	/*
	 * 根据用户构造的时候传进来的 PersonsBuilder 类别来构造小人
	 * 
	 * 注意这里!!! 一共三个步骤  调用CreatPerson 方法来画小人 是肯定不会少胳膊少腿儿的
	 */
	public void CreatPerson(){
		builder.drawHead();
		builder.drawHand();
		builder.drawFoot();
		
	}
}