基于SpringBoot设计模式之创建型设计模式·生成器模式

介绍

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  如:大都市中林立着许多高楼大厦,这些高楼大厦都是具有建筑结构的大型建筑。通常,建造和构建这种具有建筑结构的大型物体在英文中称为Build
  在建造大楼时,需要先打牢地基,搭建框架,然后自下而上地一层一层盖起来。通常,在建造这种具有复杂结构的物体时,很难一气呵成。我们需要首先建造组成这个物体的各个部分,然后分阶段将它们组装起来。

开始

架构图

生成器

样例一

定义生成器

public interface IBuilder {

    /**
     * 打开
     */
    void open();

    /**
     * 建造一个 标题
     *
     * @param str
     */
    void buildTitle(String str);

    /**
     * 生成托盘的父类
     *
     * @param str
     */
    void buildString(String str);

    /**
     * 建造一个托盘
     *
     * @param myDomainList
     */
    void buildTray(List<MyDomain> myDomainList);

    /**
     * 释放,结束
     */
    void close();
}

定义具体生成器(HTML格式、markdown格式)

实体类
@Data
public class MyDomain implements Serializable {

    /**
     * 链接
     */
    private String url;

    /**
     * 内容
     */
    private String content;

}
HTML格式生成器
@Service
@Slf4j
public class HtmlBuilder implements IBuilder {
    @Override
    public void open() {
        System.out.println("<html><head><title>HTML生成器</title></head><body>");
    }

    @Override
    public void buildTitle(String str) {
        System.out.println("<h1>" + str + "</h1>");
    }

    @Override
    public void buildString(String str) {
        System.out.println(str + "<ul>");
    }

    @Override
    public void buildTray(List<MyDomain> myDomainList) {
        for (MyDomain myDomain : myDomainList) {
            System.out.println("<li><a href=\"" + myDomain.getUrl() + "\">" + myDomain.getContent() + "</a></li>");
        }
        System.out.println("</ul>");
    }

    @Override
    public void close() {
        System.out.println("</body></html>");
    }
}

MarkDown格式生成器
@Service
@Slf4j
public class MarkDownBuilder implements IBuilder {
    @Override
    public void open() {
    }

    @Override
    public void buildTitle(String str) {
        System.out.println("# " + str);
        System.out.println();
    }

    @Override
    public void buildString(String str) {
        System.out.println(str);
    }

    @Override
    public void buildTray(List<MyDomain> myDomainList) {
        for (MyDomain myDomain : myDomainList) {
            System.out.println(" - [" + myDomain.getContent() + "](" + myDomain.getUrl() + ")");
        }
        System.out.println();
    }


    @Override
    public void close() {

    }
}

测试样例

@Slf4j
@SpringBootTest(classes = BuilderApplication.class)
public class TestBuilder {

    @Resource
    private Map<String, IBuilder> builderMap;

    @Resource
    private Director director;

    @Test
    public void testBuilder() {

        for (Map.Entry<String, IBuilder> map : builderMap.entrySet()) {
            log.info("----------------------------------------");
            log.info("这是 : {} \n 准备开始建造", map.getKey());
            director.printContent(map.getValue());
            log.info("建造完毕");
            log.info("----------------------------------------");
        }

    }
}

总结

优点

  在 Builder类中,需要声明编辑文档(实现功能)所必需的所有方法。Director 类中使用的方法都是 Builder 类提供的。因此,在 Builder 类中应当定义哪些方法是非常重要的。而且,Builder类还必须能够应对将来子类可能增加的需求。
  在示例程序中,我们只编写了支持MarkDown文档的子类和支持 HTML 代码的子类。但是将来可能还会希望能够编写其他形式(例如xxXx形式)的文档。那时候,到底能不能编写出支持xxXx形式xxXxBuilder类呢?应该不需要新的方法吧?
  虽然类的设计者并不是神仙,他们无法准确地预测到将来可能发生的变化。但是,我们还是有必要让设计出的类能够尽可能灵活地应对近期可能发生的变化。

缺点

  他的优点便也是他的缺点。之后如果要支持新的xxXx形式的文档,然而最初提供的方法并不满足他的要求,这个时候就要在生成器上添加方法,届时所有的实现类都要加上这个方法。
  除此以外,还要关心加上了之后,会不会影响到我整体设计上。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,你可以使用许多常见的设计模式来构建高效、可扩展和可维护的应用程序。以下是一些常用的设计模式Spring Boot中的应用示例: 1. 单例模式(Singleton Pattern):Spring Boot框架本身使用了单例模式来管理应用上下文(ApplicationContext),确保只有一个应用上下文实例存在。 2. 工厂模式(Factory Pattern):Spring Boot使用工厂模式创建各种Bean,例如通过@Configuration注解创建的Bean。 3. 依赖注入(Dependency Injection):Spring Boot是基于依赖注入的框架,它通过注解(如@Autowired)实现依赖注入,使得各个组件之间的关系更加松耦合。 4. 观察者模式(Observer Pattern):Spring Boot的事件机制是基于观察者模式实现的,通过定义事件和监听器,可以实现不同组件之间的解耦合。 5. 模板方法模式(Template Method Pattern):在Spring Boot中,你可以使用模板方法模式来定义通用的业务逻辑,并通过继承或实现接口来实现具体的业务逻辑。 6. 策略模式(Strategy Pattern):Spring Boot中的条件注解(如@ConditionalOnProperty)可以根据特定条件选择不同的策略来配置应用程序行为。 7. 适配器模式(Adapter Pattern):Spring Boot中的各种适配器(如WebMvcConfigurerAdapter)可以用来适配不同的框架和库,使其能够与Spring Boot集成。 这些只是一些常见的设计模式Spring Boot中的应用示例,实际上还有许多其他设计模式可以在Spring Boot应用程序中使用。根据具体的需求和场景,选择适合的设计模式可以提高代码的可读性、可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值