您的位置:首页 > 其它

【设计模式】2、生成器模式(建造者模式)

2016-02-12 17:14 260 查看
模式结构:



package com.shejimoshi.create.Builder;

/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
*         适用性:
*             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
*             当构造过程必须允许被构造的对象有不同的表示时
* 时间:2016年2月12日下午4:33:59
* 作者:cutter_point
*/
public abstract class PersonBuilder
{
//绘画一个人物需要使用到的工具
protected String tool1;
protected String tool2;

public PersonBuilder(String t1, String t2)
{
this.tool1 = t1;
this.tool2 = t2;
}

//绘画头
public abstract void buildHead();
//画身体
public abstract void buildBody();
//画左脚右脚
public abstract void buildArmLeft();
public abstract void buildArmRight();
//画左手右手
public abstract void buildLegLeft();
public abstract void buildLegRight();
}


我们的抽象生成器派生出相应的子类,用来构造相应的实际使用类型

package com.shejimoshi.create.Builder;

/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
*         适用性:
*             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
*             当构造过程必须允许被构造的对象有不同的表示时
* 时间:2016年2月12日下午4:50:31
* 作者:cutter_point
*/
public class PersonThinBuilder extends PersonBuilder
{

public PersonThinBuilder(String t1, String t2)
{
super(t1, t2);
}

@Override
public void buildHead()
{
System.out.println("画出一个瘦子的头");
}

@Override
public void buildBody()
{
System.out.println("画出一个瘦子的身体");
}

@Override
public void buildArmLeft()
{
System.out.println("画出瘦子的左臂");
}

@Override
public void buildArmRight()
{
System.out.println("画出瘦子的右臂");
}

@Override
public void buildLegLeft()
{
System.out.println("画出瘦子左腿");
}

@Override
public void buildLegRight()
{
System.out.println("画出瘦子的右腿");
}

}


package com.shejimoshi.create.Builder;

/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
*         适用性:
*             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
*             当构造过程必须允许被构造的对象有不同的表示时
* 时间:2016年2月12日下午4:53:49
* 作者:cutter_point
*/
public class PersonFatBuilder extends PersonBuilder
{

public PersonFatBuilder(String t1, String t2)
{
super(t1, t2);
}

@Override
public void buildHead()
{
System.out.println("画出一个胖子的头");
}

@Override
public void buildBody()
{
System.out.println("画出一个胖子的身体");
}

@Override
public void buildArmLeft()
{
System.out.println("画出胖子的左臂");
}

@Override
public void buildArmRight()
{
System.out.println("画出胖子的右臂");
}

@Override
public void buildLegLeft()
{
System.out.println("画出胖子左腿");
}

@Override
public void buildLegRight()
{
System.out.println("画出胖子的右腿");
}

}


我们的生成器交给指挥者来实现创建的动作

package com.shejimoshi.create.Builder;

/**
* 功能:创建人物的指挥者
* 时间:2016年2月12日下午4:55:14
* 作者:cutter_point
*/
public class PersonDirector
{
private PersonBuilder pb;

//传递相应的人物创建模型
public PersonDirector(PersonBuilder pber)
{
this.pb = pber;
}

//创建一个人
public void createPerson()
{
pb.buildHead();
pb.buildBody();
pb.buildArmLeft();
pb.buildArmRight();
pb.buildLegLeft();
pb.buildLegRight();
}
}


测试案例:

package com.shejimoshi.create.Builder;

/**
* 功能:客户端程序
* 时间:2016年2月12日下午4:57:41
* 作者:cutter_point
*/
public class Test
{
//创建相应的人物
public static void create(PersonBuilder pb)
{
//借助参数传过来的模型创建相应的对象
PersonDirector pd = new PersonDirector(pb);
pd.createPerson();
}

public static void main(String []args)
{
PersonThinBuilder ptb = new PersonThinBuilder("图像工具", "画笔");
create(ptb); //创建一个瘦子
System.out.println("==============================================================");
PersonFatBuilder pfb = new PersonFatBuilder("图像工具", "画笔");
create(pfb);
}
}


运行结果:

画出一个瘦子的头
画出一个瘦子的身体
画出瘦子的左臂
画出瘦子的右臂
画出瘦子左腿
画出瘦子的右腿
==============================================================
画出一个胖子的头
画出一个胖子的身体
画出胖子的左臂
画出胖子的右臂
画出胖子左腿
画出胖子的右腿
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: