建造者模式【图解,清晰思路】代码演示实现
建造者(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
下一篇: C语言热门考点结构体与内存对齐详解