当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 建造者模式【图解,清晰思路】代码演示实现

建造者模式【图解,清晰思路】代码演示实现

2020年08月10日  | 移动技术网IT编程  | 我要评论
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。该模式的主要优点如下:• 各个具体的建造者相互独立,有利于系统的扩展。• 客户端不必知道产品内部组成的细节,便于控制细节风险。其缺点如下:• 产品的组成部分必须相同,这限制了其使用范围。• 如果产品的内部变化复杂,该

建造者(Builder)模式的定义:

指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

该模式的主要优点如下:

• 各个具体的建造者相互独立,有利于系统的扩展。
• 客户端不必知道产品内部组成的细节,便于控制细节风险。 

其缺点如下:

• 产品的组成部分必须相同,这限制了其使用范围。
• 如果产品的内部变化复杂,该模式会增加很多的建造者类。 

建造者(Builder)模式和工厂模式的关注点不同:

  • 建造者模式注重零部件的组装过程
  • 而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构

建造者(Builder)模式的主要角色如下。

  • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。

  • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。

  • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。

  • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

为什么要使用抽象建造者,不直接使用具体创造者?

  • 稳定创建过程:使用接口或者抽象类时,子类继承或实现,一定会实现父类方法,而如果不使用的话,在写具体创造者的过程中可能因为马虎,造成每一个具体实现类有可能不一样。

接下来我用UML类图展示建筑者模式的结构
在这里插入图片描述

下面我来用代码演示过程

1. Human 产品类

package com.ncst.bulider; /**
 * @Date 2020/8/8 14:54
 * @Author by LiShiYan
 * @Descaption
 */ public class Human { private String eye; private String mouth; private String leg; public String getEye() { return eye; } public void setEye(String eye) { this.eye = eye; } public String getMouth() { return mouth; } public void setMouth(String mouth) { this.mouth = mouth; } public String getLeg() { return leg; } public void setLeg(String leg) { this.leg = leg; } @Override public String toString() { return "Human{" + "eye='" + eye + '\'' + ", mouth='" + mouth + '\'' + ", leg='" + leg + '\'' + '}'; } } 

2.HumanBuilder 抽象建筑者接口

package com.ncst.bulider; /**
 * @Date 2020/8/8 14:52
 * @Author by LiShiYan
 * @Descaption
 */ public interface HumanBuilder { void setEye(); void setLeg(); void setMouth(); //返回人的身体 Human getBOdy(); } 

3.BlackHuman 具体建造者1

package com.ncst.bulider; /**
 * @Date 2020/8/8 14:58
 * @Author by LiShiYan
 * @Descaption
 */ public class YellowHuman implements HumanBuilder { private Human human = new Human(); @Override public void setEye() { human.setEye("黑黑的眼睛"); } @Override public void setLeg() { human.setLeg("长长的腿"); } @Override public void setMouth() { human.setMouth("红红的嘴"); } @Override public Human getBOdy() { return human; } } 

BlackHuman 具体建筑者2

package com.ncst.bulider; /**
 * @Date 2020/8/8 14:58
 * @Author by LiShiYan
 * @Descaption
 */ public class BlackHuman implements HumanBuilder { private Human human = new Human(); @Override public void setEye() { human.setEye("蓝蓝的眼睛"); } @Override public void setLeg() { human.setLeg("短短的腿"); } @Override public void setMouth() { human.setMouth("黑黑的嘴"); } @Override public Human getBOdy() { return human; } } 

4.DIrector 指挥者

package com.ncst.bulider; /**
 * @Date 2020/8/8 15:10
 * @Author by LiShiYan
 * @Descaption
 */ public class Director { public Human build(HumanBuilder humanBuilder) { humanBuilder.setEye(); humanBuilder.setMouth(); humanBuilder.setLeg(); return humanBuilder.getBOdy(); } } 

5.Client测试类
我们使用建造者模式,当添加一个新类,如白种人类,会非常简单,符合OCP原则
添加白种人类如法炮制不在演示

package com.ncst.bulider; /**
 * @Date 2020/8/8 15:09
 * @Author by LiShiYan
 * @Descaption
 */ public class Client { public static void main(String[] args) { Human black = new Director().build(new BlackHuman()); System.out.println("黑种人"+black); //新添加一个白种人 Human white=new Director().build(new WhiteHuman()); System.out.println("白种人"+white); } } 

测试结果
在这里插入图片描述

本文地址:https://blog.csdn.net/qq_40965479/article/details/107881162

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网