创建型模式-建造者模式

建造者模式(Builder pattern)

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

与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户和指导联系,指导者联系建造者最后得到产品牌。即建造模式可以强制实现一种分步骤进行的建造过程。

建造者模式将复杂的内部创建封装在内部,对于外部调用者来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心

 

建造者模式角色

  • 抽象建造者角色(Builder):该角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑;
  • 具体建造者角色(Concrete Builder):该角色实现抽象建造者角色中定义的所有方法,并且返回一个组件好的产品实例;
  • 产品角色(Product):该角色是建造中的复杂对象,一个系统中会有多于一个的产品类,这些产品类并不一定有共同的接口,完全可以是不相关联的;
  • 导演者角色:该角色负责安排已有模块的顺序,然后告诉Builder开始建造。

 

建造者模式的优点

  • 封装性,使用建造者模式可以使客户端用户不用关心产品内部的组成细节;
  • 建造者独立,容易扩展;
  • 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造者过程逐渐细化,而不对其他的模块产生影响。


建造者模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的结果;
  • 多个部件和零件,都可以装配到一个对象中,但是产生的运行结果又不同时;
  • 产品类复杂,或者产品类中的方法调用顺序不同产生不同的效能;
  • 在对象创建过程中会使用到系统的一些其他对象。


女娲造人例子

package buildermodel;

public class Person {

	private String head;
	
	private String body;
	
	private String hand;
	
	private String foot;

	public String getHead() {
		return head;
	}

	public void setHead(String head) {
		this.head = head;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getHand() {
		return hand;
	}

	public void setHand(String hand) {
		this.hand = hand;
	}

	public String getFoot() {
		return foot;
	}

	public void setFoot(String foot) {
		this.foot = foot;
	}
	
	public String toString(){
		return "head: "+head+"\t body: "+body+"\t hand:"+hand+"\t foot: "+foot;
	}
}

package buildermodel;

/**
 * 建造者:女娲
 *
 */
public interface Builder {

	public void buildHead();
	
	public void buildBody();
	
	public void buildHand();
	
	public void buildFoot();
	
	public Person getPerson();
}

package buildermodel;
/**
 * 用于制造男人的建造者
 *
 */

public class MainBuilder implements Builder {

	private Person person;
	
	public MainBuilder(){
		person = new Person();
		buildHead();
		buildBody();
		buildHand();
		buildFoot();
	}
	
	@Override
	public void buildHead() {
		// TODO Auto-generated method stub
		person.setHead("man's head");
	}

	@Override
	public void buildBody() {
		// TODO Auto-generated method stub
		person.setBody("man's body");
	}

	@Override
	public void buildHand() {
		// TODO Auto-generated method stub
		person.setHand("man's hand");
	}

	@Override
	public void buildFoot() {
		// TODO Auto-generated method stub
		person.setFoot("man's foot");
	}

	public Person getPerson(){
		return person;
	}
}

package buildermodel;

/**
 * 用于制造女人的建造者
 *
 */
public class WomanBuilder implements Builder {

	private Person person;
	
	public WomanBuilder(){
		
		person = new Person();
		buildHead();
		buildBody();
		buildHand();
		buildFoot();
	}
	
	@Override
	public void buildHead() {
		// TODO Auto-generated method stub
		person.setHead("woman's head");
	}

	@Override
	public void buildBody() {
		// TODO Auto-generated method stub
		person.setBody("woman's body");
	}

	@Override
	public void buildHand() {
		// TODO Auto-generated method stub
		person.setHand("woman's hand");
	}

	@Override
	public void buildFoot() {
		// TODO Auto-generated method stub
		person.setFoot("woman's foot");
	}

	public Person getPerson(){
		return person;
	}
}

package buildermodel;

/**
 * 导演者Director
 *
 */
public class PersonDirector {

	Builder builder;
	public Person createPerson(String builderName){
		if("main".equals(builderName)){
			builder = new MainBuilder();
		}else if("woman".equals(builderName)){
			builder = new WomanBuilder();
		}
		return builder.getPerson();
	}
}

package buildermodel;

public class TestBuilderModel {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PersonDirector director = new PersonDirector();
		//创造男人
		System.out.println(director.createPerson("main"));
		
		//创造男人
		System.out.println(director.createPerson("woman"));
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值