欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-03 09:48:41
建造者(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