设计模式之建造者模式

1. 建造者模式定义:将一个复杂对象的构建与她的表示分离,使得同样的建造过程可以创建不同的表示。Separate the construction of a complex object from its representation so that the same construction process can create different representations.

2. 简单代码示例:

public abstract class House {                      //先使用模板方法定义一个房子的抽象类,房子各个部分的具体设计可以由子类进行设计
        public abstract void  setKeTing();
        public abstract void  setWoShi();
        public abstract void  setCeSuo();
        public abstract void  setShuFang();
        public abstract void  setCanTing();
        
        public void setHouse(int [] requirement)   //此方法用于组成一个房子, 房子可以由上述设计的某几个部分组成,而具体的组成可有建造者根据需求来设计。
        {
        	for(int i=0;i<requirement.length;i++)
        	{
        		switch(requirement[i])
        		{
        		case 1: setKeTing();break;
        		case 2: setWoShi();break;
        		case 3: setCeSuo();break;
        		case 4: setShuFang();break;
        		case 5: setCanTing();break;
        		case 6: setWoShi();System.out.print("在卧室里面还带有");setCeSuo();break;
        		}
        	}
        }
}
public class HouseDesign extends House {             //房子的各个部分进行的具体设计,通过模板方法可以将调用和设计解耦

	@Override
	public void setKeTing() {
		// TODO Auto-generated method stub
		System.out.println("这个样子设计的客厅");
	}

	@Override
	public void setWoShi() {
		// TODO Auto-generated method stub
		System.out.println("这个样子设计的卧室");
	}

	@Override
	public void setCeSuo() {
		// TODO Auto-generated method stub
		System.out.println("这个样子设计的厕所");
	}

	@Override
	public void setShuFang() {
		// TODO Auto-generated method stub
		System.out.println("这个样子设计的书房");
	}

	@Override
	public void setCanTing() {
		// TODO Auto-generated method stub
		System.out.println("这个样子设计的餐厅");
	}
}
public abstract class HouseBuilder {             //抽象的建造者
          public abstract void setCondition();
          public abstract House getHouse();
}
public class HousePattern1Builder  extends HouseBuilder{     //一个具体的建造者,建造按照某种模式,或者客户指定的模式建造
	House house=new HouseDesign();
	static int []requirement={1,2,3,4,5};
	
	public  HousePattern1Builder() {
		// TODO Auto-generated constructor stub
		this(requirement);
	}
	
	public HousePattern1Builder(int [] require) {
		// TODO Auto-generated constructor stub
		requirement=require;
		setCondition();
	}
	
	
	@Override
	public void setCondition() {
		// TODO Auto-generated method stub
		house.setHouse(requirement);
	}

	@Override
	public House getHouse() {
		// TODO Auto-generated method stub
		return  house;
	}
}
public class HousePattern2Builder extends HouseBuilder {    //如果组成十分复杂,种类繁多,可以定义多种建造者,建造不同种类的房子或者产品。
	House house=new HouseDesign();
	static int []requirement={1,6,3,4,5};
	public  HousePattern2Builder() {
		// TODO Auto-generated constructor stub
		this(requirement);
	}
	public HousePattern2Builder(int [] require) {
		// TODO Auto-generated constructor stub
		requirement=require;
		setCondition();
	}
	@Override
	public void setCondition() {
		// TODO Auto-generated method stub
		house.setHouse(requirement);
	}

	@Override
	public House getHouse() {
		// TODO Auto-generated method stub
		return  house;
	}
}
System.out.println("建造者模式");
         System.out.println("------------------------生产第一种模式的房子--------------------------");
         HouseBuilder houseBuilder1=new HousePattern1Builder();             //调用者不用知道具体是怎么建造的,它只负责提供某些需求
        House house=houseBuilder1.getHouse();                              //然后由具体建造者负责建造出来。
        
         System.out.println("------------------------生产第二种模式的房子--------------------------");
         int [] CustomerRequire={1,6,3,4,5};
  HouseBuilder houseBuilder2=new HousePattern2Builder(CustomerRequire); House house2=houseBuilder2.getHouse();
建造者模式
------------------------生产第一种模式的房子--------------------------
这个样子设计的客厅
这个样子设计的卧室
这个样子设计的厕所
这个样子设计的书房
这个样子设计的餐厅
------------------------生产第二种模式的房子--------------------------
这个样子设计的客厅
这个样子设计的卧室
在卧室里面还带有这个样子设计的厕所
这个样子设计的厕所
这个样子设计的书房
这个样子设计的餐厅


    使用建造者模式可以使客户不用知道产品内部的组成细节,不同模式的组成相互独立,建造的过程可以逐步细化而不对其他模块产生影响。

    建造者模式适用于零件的装配(不同的顺序,不同的零件,甚至不同的装备方法以达到不同的效用)。建造者模式对于复杂对象的封装创建很有用。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值