GOF设计模式——Builder模式

一、什么是Builder模式?

builder模式,就好比一栋大楼,这栋大楼有很多个组件组成,但是这栋大楼只是一个各个组件结合起来的框架,每一栋大楼都有各自的特色,这些特色由它们实际情况决定。对于程序而言,这栋大楼就好比一个Builder抽象类,里面定义了很多组件方法,一个完整的功能离不开里面的每一个方法,具体实现依赖子类,只要继承这个抽象类,就可以根据组件方法组建起自己的“大楼”。

二、Builder模式思想

Builder类:负责生成实例的接口,里面定义了用于生成实例的方法;

ConcreteBuilder类:负责实现Builder抽象类,此外还定义了获取最终结果(大楼)的方法;

Director类:负责使用Builder抽象类生成实例,它并不依赖Builder的具体子类,所以它只会调用Builder里面定义的方法。

三、应用实例

设计一个Builder,用于编写文档,可以是Text文档,也可以是HTML文档。

1、Builder类

package com.cjs.builder;

public abstract class Builder {
    public abstract void makeTitle(String title);

    public abstract void makeString(String str);

    public abstract void makeItem(String[] items);

    public abstract void close();
}

2、Director类

package com.cjs.builder;

public class Director {
    Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.makeTitle("Greeting");
        builder.makeString("从早上至下午");
        builder.makeItem(new String[]{"Good Morning", "Good Afternoon"});
        builder.makeString("晚上");
        builder.makeItem(new String[]{"Good Night","Bye-Bye"});
        builder.close();
    }
}

3、TextBuilder类

package com.cjs.builder;

public class TextBuilder extends Builder {
    private StringBuilder buffer = new StringBuilder();
    @Override
    public void makeTitle(String title) {
        buffer.append("=========================\n");
        buffer.append("[" + title + "]\n");
        buffer.append("\n");
    }

    @Override
    public void makeString(String str) {
        buffer.append("■" + str + "\n");
        buffer.append("\n");

    }

    @Override
    public void makeItem(String[] items) {
        for (int i = 0; i < items.length; i++) {
            buffer.append("    ·" + items[i] + "\n");
            buffer.append("\n");
        }
    }

    @Override
    public void close() {
        buffer.append("=========================\n");
    }

    public String getResult() {
        return buffer.toString();
    }
}

4、HTMLBuilder类

package com.cjs.builder;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class HTMLBuilder extends Builder {
    private String fileName;
    private PrintWriter writer;
    @Override
    public void makeTitle(String title) {
        fileName = title + ".html";
        try {
            writer = new PrintWriter(new FileWriter(fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.println("<html><head><title>" + title + "</title></head><body>");
        writer.println("<h1>"+title+"</h1>");
    }

    @Override
    public void makeString(String str) {
        writer.println("<p>"+str+"</p>");
    }

    @Override
    public void makeItem(String[] items) {
        writer.println("<ul>");
        for (int i = 0; i < items.length; i++) {
            writer.println("<li>" + items[i] + "</li>");
        }
        writer.println("</ul>");

    }

    @Override
    public void close() {
        writer.println("</body></head");
        writer.close();
    }

    public String getResult() {
        return fileName;
    }
}

5、Main类

package com.cjs.builder;

public class Main {
    public static void main(String[] args) {
        if (args.length != 1) {
            usage();
            System.exit(0);
        }
        if (args[0].equals("plain")) {
            TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            director.construct();
            String result = textBuilder.getResult();
            System.out.println(result);
        } else if (args[0].equals("html")) {
            HTMLBuilder htmlBuilder = new HTMLBuilder();
            Director director = new Director(htmlBuilder);
            director.construct();
            System.out.println(htmlBuilder.getResult()+"文件编写完成");
        } else {
            usage();
            System.exit(0);
        }
    }

    public static void usage() {
        System.out.println("Usage: java main plain  编写文本文档");
        System.out.println("Usage: java main html  编写HTML文档");
    }
}

对于Director类,它并不关心实际编写文档是采用纯文本,还是HTML,所以在Builder抽象类里必须声明足够多的方法,同时,Builder类的实现类可以拥有自己独特的方法,以实现各自对实际情况的逻辑需求。

原文地址:https://www.cnblogs.com/SysoCjs/p/10327199.html

时间: 2024-11-06 07:19:04

GOF设计模式——Builder模式的相关文章

设计模式-----Builder模式

前言 近日,看到Myabtis中组件中SqlSessionFactory由SqlSessionFactoryBuilder().build()生成时,且采用Builder模式,遂记录学习之. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 1.什么是Builder模式? (1)对于复杂的对象,如果只是用构造方法创建的话,构造方法中会存在很多的逻辑,那么我们可以一步步有

java设计模式--Builder模式

一.Builder模式 二.使用例子 三.Spring中的Builder模式 Builder模式,构建者.构造者模式,在<图解设计模式>中归为 生成实例 一栏,该模式用于组装具有复杂结构的实例: 当需要逐步获取对象的初始值时,可以使用Builder模式: 一.Builder模式角色 Builder:建造者,Builder角色负责定义用来生成实例的接口API,Builder角色中准备了用于生成实例的具体方法: ConcreteBuilder:具体的建造者,负责实现Builder接口的的类,定义了

设计模式——Builder模式

什么是Builder模式: 如果按照网上的定义,理解起来相对不是简单易懂,我们可以打个比方,当需要构建一个复杂的对象时,比如说要生成一辆汽车,那么我们就需要先生成出构成这辆汽车的各个部件如车轮,发动机,方向盘,后视镜等,然后再将这些部件组装起来,最终组装成一辆完整的车.Builder模式的精髓就是将部件的生产和最终的组装分离出来.这样代码的模块化更强,更易于维护. Builder模式举例: 1 定义一个Builder(建造)接口,声明"生产各个部件的方法以及组装各个部件的方法": pu

GOF设计模式——Singleton模式

一.什么是Singleton模式? Singleton模式就是平常所说的单例模式,简单来说就只有一个实例.在使用java.lang.String的时候,将不同的字符串赋给String引用,其实就是创建了一个String对象实例,当有1000个不同的字符串创建的时候,就会出现1000个实例.有时候,我们只想在程序里面创建一个实例,譬如Hibernate的SessionFactory,那么我们可以使用Singleton模式来设计某一个类从始至终,程序调用的都是属于同一个实例. 二.Singleton

GOF设计模式——Prototype模式

一.什么是Prototype模式? 在编程中,我们可以使用new关键字指定类名来生成类的实例,但是有时候也会有不指定类名的前提下生成实例.因为有时候对象种类繁多,无法将它们整合到一个类中:或者,生成实例的过程过于复杂,难以根据类生成实例:又或者,想要将类与框架解耦.这时,为了能够在不使用类名的情况下生成实例,可以使用Prototype模式,Prototype模式又叫原型模式,专门做一些"复制"的操作. 二.Prototype模式思想 Client负责调用Prototype接口生成实例,

设计模式初学者笔记:Builder模式

[作者:byeyear    Email:[email protected]    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七八遍,才敢说自己对其有了初步的了解.这比花在Abstract Factory上的时间长多了.如果GoF将Builder模式放在第一个讲,估计我就会把这本书归结成天书直接扔一边了. Builder模式的关键在于,将“要做什么”与“做出来”分离,将“如何装配”与“完成装配”分离: Director知道“要做

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式.在这之前,先温习一下前面介绍的4种模式. 设计模式很重要! 设计模式很重要! 设计模式很重要! 重要的事说三遍!!! Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 Android开发中无处不在的设计模式--原型模式 接着看下策略模式的定义 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它

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

最近又看了下建造者模式Builder,在网上找了很多文章,但是总感觉有一些问题. 有些示例明明很像一个工厂模式,还有些示例会导致具体建造者类无限膨胀,好像都不大适合使用这个模式.后来又对照GOF重新看了下,同时参考了http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html等文章,写下自己的理解. 1.定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.在以下情况使用建造者模式• 当创建复杂对象的算