设计模式之--------建造者(builder)模式

先来引入一个情景:一个餐厅制作不同种类的汉堡包,这些汉堡包有由面包,肉,蔬菜,调料组成,每个汉堡的这些食材各不相同,有些制作顺序也有不同。但是当我们点餐时,我们不必关心这些汉堡的制作过程,我们只需告诉前台服务员要什么汉堡就可以。

以上这个情景描述了一个建造者模式!建造者模式的作用就是:用户不必了解自己所要的对象的创建细节,便能创建并获得该对象。

一图胜千言,先上类图!


Director------------------>指挥者

Builder------------------->抽象建造者,一般有多个,对应不同的产品

ConcreteBuilder------->具体建造者

Product------------------->产品

plus:由三个类之间的关系就可以看出,用户通过向Director发送消息(传入builder对象)来创建产品。

下面上一段代码:

//演员类
public class Actor {
	private String type;
	private String sex;
	private String face;
	private String costume;
	private String hairstyle;
	public void setType(String type)
	{
		this.type=type;
		
	}
	public void setSex(String sex)
	{
		this.sex=sex;
		
	}
	public void setFace(String face)
	{
		this.face=face;
		
	}
	public void setCostume(String costume)
	{
		this.costume=costume;
		
	}
	public void setHairstyle(String hairstytle)
	{
		this.hairstyle=hairstytle;
		
	}
	public String getType()
	{
		return this.type;
		
	}
	public String getSex()
	{ 
		return this.sex;
		
	}
	public String getFace()
	{
		return this.face;
		
	}
	public String getCostume()
	{
		return this.costume;
		
	}
	public String getHairstyle()
	{
		return this.hairstyle;
		
	}
}

abstract class ActorBuilder//抽象建造者类!!!!!
{  
	protected Actor actor=new Actor();
	public abstract void buildType();
	public abstract void buildSex();
	public abstract void buildFace();
	public abstract void buildCostume();
	public abstract void buildHairstyle();
	public Actor createActor()
	{
		return actor;
	}
}
class HeroBuilder extends ActorBuilder//具体建造者类
{
	public  void buildType()
	{
	actor.setType("英雄");
	}
	public  void buildSex()
	{
		actor.setSex("男");
	}
	public  void buildFace()
	{
		actor.setFace("英俊");
	}
	public  void buildCostume()
	{
		actor.setCostume("盔甲");
	}
	public  void buildHairstyle()
	{
		actor.setHairstyle("飘逸");
	}
}
class AngelBuilder extends ActorBuilder//具体建造者类
{
	public  void buildType()
	{
		actor.setType("天使");
	}
	public  void buildSex()
	{
		actor.setSex("女");
	}
	public  void buildFace()
	{
		actor.setFace("漂亮");
	}
	public  void buildCostume()
	{
		actor.setCostume("白裙");
	}
	public  void buildHairstyle()
	{
		actor.setHairstyle("长发");
	}
}
class GhostBuilder extends ActorBuilder//具体建造者类
{
	public  void buildType()
	{
		actor.setType("魔鬼");
	}
	public  void buildSex()
	{
		actor.setSex("妖");
	}
	public  void buildFace()
	{
		actor.setFace("丑陋");
	}
	public  void buildCostume()
	{
		actor.setCostume("黑衣");
	}
	public  void buildHairstyle()
	{
		actor.setHairstyle("光头");
	}
}
class ActorController//指挥者!!!用于构建实现一个Builder借口对象
{
	public Actor construct(ActorBuilder ab)//参数为父类类型
	{
		Actor actor;
		ab.buildType();
		ab.buildSex();
		ab.buildFace();
		ab.buildCostume();
		ab.buildHairstyle();
		actor=ab.createActor();
		return actor;
	}
	
}
class Clicent
{  
public static void main(String args[])
{
	 ActorController actorcontroller;
	 actorcontroller=new ActorController();
	 ActorBuilder  herobuilder;
	 herobuilder=new HeroBuilder();
	 Actor hero;
	 hero=actorcontroller.construct(herobuilder);
	 String type=hero.getType();
	 System.out.println(type+"的外观");
	 System.out.println(""+hero.getCostume());
	 System.out.println(""+hero.getFace());
	 System.out.println(""+hero.getHairstyle());
	 System.out.println(""+hero.getSex());
}
}
这里Actor类对相应产品类,ActorBuilder和其他几个Builder分别对应抽象Builder和具体Builder。可以看出每个具体Builder都有自己独特的实现。

还可以看出,Builder包含一个Actor对象,所以很明显actor对象是由Builder直接操作的,但是这些操作的调用是在ActorController(即:Director类)中完成的。

通过传递Builder对象给Director对象就可以创建相应的产品。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值