理解java设计模式之建造者模式
作者:cutter_point 时间:2023-03-13 14:48:55
建造者模式(Builder Pattern)主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。因此, 建造者模式主要用来解决“对象部分”的需求变化。 这样可以对对象构造的过程进行更加精细的控制。
package com.shejimoshi.create.Builder;
/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
* 适用性:
* 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
* 当构造过程必须允许被构造的对象有不同的表示时
*/
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;
/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
* 适用性:
* 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
* 当构造过程必须允许被构造的对象有不同的表示时
*/
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;
/**
* 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
* 适用性:
* 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
* 当构造过程必须允许被构造的对象有不同的表示时
*/
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;
/**
* 功能:创建人物的指挥者
*/
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;
/**
* 功能:客户端程序
*/
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);
}
}
运行结果:
画出一个瘦子的头
画出一个瘦子的身体
画出瘦子的左臂
画出瘦子的右臂
画出瘦子左腿
画出瘦子的右腿
==============================================================
画出一个胖子的头
画出一个胖子的身体
画出胖子的左臂
画出胖子的右臂
画出胖子左腿
画出胖子的右腿
标签:java,设计模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Android SeekBar实现平滑滚动
2022-01-21 10:51:24
![](https://img.aspxhome.com/file/2023/6/97876_0s.jpg)
Java设计模式之工厂模式
2023-12-18 01:40:50
![](https://img.aspxhome.com/file/2023/9/60339_0s.png)
C++日期类计算器的模拟实现举例详解
2023-05-22 08:27:16
Java中保留两位小数的四种方法实现实例
2022-07-15 20:12:23
springboot 动态数据源的实现方法(Mybatis+Druid)
2021-07-26 04:27:00
![](https://img.aspxhome.com/file/2023/8/68188_0s.png)
Android中Service的全面总结
2022-12-30 22:09:09
![](https://img.aspxhome.com/file/2023/4/138814_0s.jpg)
C++11中的可变参数模板/lambda表达式
2023-06-10 18:20:14
![](https://img.aspxhome.com/file/2023/3/112293_0s.png)
解决springboot URL带有斜杠的转义字符百分之2F导致的400错误
2022-05-08 07:27:32
![](https://img.aspxhome.com/file/2023/3/75703_0s.png)
Java Swing GridBagLayout网格袋布局的实现
2023-07-11 19:34:26
![](https://img.aspxhome.com/file/2023/8/74908_0s.png)
ElasticSearch学习之ES Mapping实战示例
2023-11-25 06:12:25
Android亮屏和熄屏控制实例详解
2023-10-12 06:57:04
windows下java环境变量的设置方法
2022-12-01 03:13:14
c# 以二进制读取文本文件
2023-02-28 15:23:26
浅谈Java内省机制
2021-06-13 17:54:05
![](https://img.aspxhome.com/file/2023/2/106152_0s.png)
Ubuntu中为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序
2022-07-20 15:09:51
Java String对象使用方法详解
2023-12-14 14:43:52
Java中list.contains()的用法及拓展
2022-11-06 21:04:59
![](https://img.aspxhome.com/file/2023/9/113199_0s.jpg)
Java超详细分析抽象类和接口的使用
2021-06-09 12:19:05
![](https://img.aspxhome.com/file/2023/6/70366_0s.png)
Android自定义控件简单实现侧滑菜单效果
2023-10-30 16:56:57
![](https://img.aspxhome.com/file/2023/0/138970_0s.gif)
springboot解决java.lang.ArrayStoreException异常
2023-06-24 19:22:25
![](https://img.aspxhome.com/file/2023/0/76250_0s.jpg)