建造者(Builder)模式

在学习MyBatis的过程中遇到了建造者(Builder)模式,查找了相关资料,在这做下记录加深印象。

参考资料:

  1. java设计模式-建造者模式(Builder)
  2. 人人都会设计模式---建造者模式--Builder
  3. 《JAVA与模式》之建造模式

1.什么是建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品。

2.一个组装电脑的示例

小明想组装一个台式电脑,小明对电脑配置一窍不通,就直接跑到电脑城给装机老板说我要一台打游戏非常爽的电脑,麻烦你给装一下「配置什么的你给我推荐一下吧」,于是老板就让它的员工「小美」按小明的要求装了一个性能灰常牛 B 的电脑,1 个小时后电脑装好了,小明交钱拿电脑走人。不一会儿小张又来了,要一个满足平时写文章就可以的电脑,老板针对小张的要求给不同的装机配置。不同的人有不同的配置方案「但是装机流程是一样的」,这就是一个典型的建造者模式。

2.1创建被建造的电脑对象-----Computer.java

 1 package club.nipengfei.demo02;
 2
 3 /**
 4  * 产品类--被建造的对象
 5  */
 6 public class Computer {
 7     private String cpu ; // cpu
 8     private String hardDisk ; //硬盘
 9     private String mainBoard ; // 主板
10     private String memory ; // 内存
11
12     public String getCpu() {
13         return cpu;
14     }
15
16     public void setCpu(String cpu) {
17         this.cpu = cpu;
18     }
19
20     public String getHardDisk() {
21         return hardDisk;
22     }
23
24     public void setHardDisk(String hardDisk) {
25         this.hardDisk = hardDisk;
26     }
27
28     public String getMainBoard() {
29         return mainBoard;
30     }
31
32     public void setMainBoard(String mainBoard) {
33         this.mainBoard = mainBoard;
34     }
35
36     public String getMemory() {
37         return memory;
38     }
39
40     public void setMemory(String memory) {
41         this.memory = memory;
42     }
43 }

2.2抽象的建造者-----Builder.java

 1 package club.nipengfei.demo02;
 2
 3 /**
 4  * 抽象的建造者,即装电脑的步骤
 5  * 至于安装什么型号的主板,不是我关心,而是具体的建造者关心的
 6  */
 7 public interface Builder {
 8     // 安装主板
 9     void createMainBoard(String mainBoard) ;
10     // 安装 cpu
11     void createCpu(String cpu) ;
12     // 安装硬盘
13     void createhardDisk(String hardDisk) ;
14     // 安装内存
15     void createMemory(String memory) ;
16     // 组成电脑
17     Computer createComputer() ;
18 }

2.3具体建造者,也就是装机工人小美 -----AssemblerBuilder.java

 1 package club.nipengfei.demo02;
 2
 3 public class AssemblerBuilder implements Builder {
 4     Computer computer = new Computer();
 5     @Override
 6     public void createMainBoard(String mainBoard) {
 7         computer.setMainBoard(mainBoard);
 8     }
 9
10     @Override
11     public void createCpu(String cpu) {
12         computer.setCpu(cpu);
13     }
14
15     @Override
16     public void createhardDisk(String hardDisk) {
17         computer.setHardDisk(hardDisk);
18     }
19
20     @Override
21     public void createMemory(String memory) {
22         computer.setMemory(memory);
23     }
24
25     @Override
26     public Computer createComputer() {
27         return computer;
28     }
29 }

2.4还有老板安排装机工工作

package club.nipengfei.demo02;

/**
 * 声明一个导演类「指挥者,这里可以装电脑的老板」,用来指挥组装过程,也就是组装电脑的流程
 */
public class Director {
    private Builder builder;
    // 使用多态,装机工很多,老板可以指挥各个装几个
    public Director(Builder builder){
        this.builder = builder;
    }
    // 老板最后只想获得装成的成品
    public Computer createComputer(String cpu,String hardDisk,String mainBoard,String memory){
        // 具体工作是装机工去做
        this.builder.createMainBoard(mainBoard);
        this.builder.createCpu(cpu);
        this.builder.createMemory(memory);
        this.builder.createhardDisk(hardDisk);
        return this.builder.createComputer();
    }
}

2.5测试类----Test.java

 1 package club.nipengfei.demo02;
 2
 3 public class Test {
 4     public static void main(String[] args) {
 5         // 装机员小美
 6         Builder builder = new AssemblerBuilder();
 7         // 老板把小明的需求转给小美
 8         Director director = new Director(builder);
 9         // 老板最后拿到成品电脑,工作小美去做
10         Computer computer = director.createComputer("Intel 酷睿i9 7900X","三星M9T 2TB (HN-M201RAD)","技嘉AORUS Z270X-Gaming 7","科赋Cras II 红灯 16GB DDR4 3000");
11         System.out.println("小明使用的电脑是:\n"+computer.getMainBoard()+"主板\n"+computer.getCpu()+"CPU\n"+computer.getHardDisk()+"硬盘\n"+computer.getMemory()+"内存\n");
12     }
13 }

2.6运行测试类结果

1 小明使用的电脑是:
2 技嘉AORUS Z270X-Gaming 7主板
3 Intel 酷睿i9 7900XCPU
4 三星M9T 2TB (HN-M201RAD)硬盘
5 科赋Cras II 红灯 16GB DDR4 3000内存

3.建造者模式的特点

建造者模式是一种创建型模式,适用于那些流程固定「顺序不一定固定」,建造的目标对象会有所改变这种场景「比如画一条狗,这个目标不变,但是不同的是有黄狗,胖狗,瘦狗等」。上面的示例中安装电脑的流程是固定的,建造的目标对象会改变,Computer.java的对象不同,可以有不同的主板,CPU,硬盘,内存。

4.建造者模式的作用

  1. 用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」。在测试类中直接使用Director类的createComputer方法创建出computer对象。
  2. 用户只需给出复杂对象的内容和类型可以创建出对象。将参数给Director类对象。
  3. 建造者模式按流程一步步的创建出复杂对象。流程在Director.java中的createComputer方法,具体工作有装机工完成。

5.建造者模式的优缺点

  • 优点

    1. 使创建产品的步骤「把创建产品步骤放在不同的方法中(AssemblerBuilder.java中的各个方法),更加清晰直观」和产品本身分离,即使用相同的创建过程创建出不同的产品。
    2. 每个建造者都是独立的互不影响,这样就达到解耦的目的,所以如果想要替换现有的建造者那非常方便,添加一个实现即可。
  • 缺点
    1. 只适用于产品具有相同的特点「过程和步骤」,如果产品之间差异非常大,则不适用「使用范围受限」
    2. 万一那天产品内部发生改变,那多个建造者都要修改,成本太大

6.建造者模式的使用场景

  1. 如果一个对象有非常复杂的内部结构「这些产品通常有很多属性」,那么使用建造者模式
  2. 如果想把复杂对象的创建和使用分离开来,那么使用建造者模式「使用相同的创建步骤可以创建不同的产品」

原文地址:https://www.cnblogs.com/qzwl/p/11805954.html

时间: 2024-08-29 08:54:31

建造者(Builder)模式的相关文章

Java 实现建造者(Builder)模式

建造者(Builder)模式是创建型模式,创建了一个对外隐藏创建过程的产品,使用组合的方式,由指挥者(Director)来决定建造的流程 public interface Builder { void buildPartA(); void buildPartB(); void buildPartC(); } public class BuilderImpl implements Builder { @Override public void buildPartA() { System.out.p

Android 建造者(Builder)模式

关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Builder 模式的地方还是很多的. 使用时 大概如下: Notification noti = new Notification.Builder(context).build(); AlertDialog dialog = new AlertDialog.Builder(context).create

设计模式之建造者(Builder)模式

意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以表示不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同的表示时. UML图 Builder --为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder --实现Builder的接口以构造和装配该产品的各个部件. --定义并明确它所创建的表示. --提供一个检索产品的接口. Director --构造一个使用Builder接口的

设计模式--建造者(Builder)模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模式>GOF Insus.NET在ASP.NET环境中,列举一个建造者设计模式(Builder)例子,以最帖近开发环境与需求. 开发站点时,我们需要开发新闻类,视频类,图片类等等.每个网页还有可能是页头,内容,页脚等.开发这些页头,内容与页脚时,我们会使用用户控件来写好,加载至网页中去. 每个类别的网页,

Java建造者模式(Builder模式)

Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到. 为何使用建造者模式 是为了将构建复杂对象的过程和它的部件解耦.注意:是解耦过程和部件. 因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮.方向盘.发动机,还

Java设计模式--------建造者模式(Builder模式)

Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们.用户不知道内部的具体构建细节.Builder模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到. 为何使用建造者模式 是为了将构建复杂对象的过程和它的部件解耦.注意:是解耦过程和部件. 因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮.方向盘.发动机,还

菜鸟学设计模式系列笔记之建造者模式(Builder模式)

提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化. 从而保持系统中的"稳定构建算法"不随需求变化而变化.----建造者模式 建造模式是对象的创建模式 建造模式可以将一个产品的内部表象与产品的生成过程分割开来, 从而可以是一个建造过程生成具有不同的内部表象的产品对象. Intent : 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 Motivation: 在复杂对象的构造过程中,允许同样的构造过程能够加入新的被

Builder模式(建造者模式)

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则. 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数, DoDoContact(String name); DoDoContact(String name, int age); DoDoContact(S

Android Builder模式在开发中的应用

最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder(R.drawable.default_img) .crossFade() .into(mImageView); 同时在年初的时候,学习RXJava的时候,用链式编程很优雅. Observable .just( "1" , "2" ) .subscribeOn(Sche