• 建造者模式


    建造者模式和工厂模式有点类似。所以建议复习一下工厂模式的文章 工厂模式小结

    1. 适用场景

    建造者模式,跟工厂模式一样,对客户端屏蔽了产品实现的细节,对外只呈现一个最终的产品。

    与工厂模式不太一样的是:

    1). 该产品相对于工厂模式的产品更为复杂,通常是由好几个模块组装而成;

    2). 模块的生成顺序是稳定的;或者说,可以通过建造者模式来指定模块的生成顺序。比如组装一台PC,可以指定按顺序买显示器,机箱,主板,CPU,内存,SSD,键盘等等。

    2. 结构分析

    Builder,建造者,通常是个接口或抽象类。定义了一系列的模块生产方法,以及最终返回产品的方法。

    ConcreteBuiler,具体的建造者。Builder的实现类,实现对各个模块的生产和最终返回的产品。通过实现不同的建造者,可以扩展不同的产品。

    Director,指挥者,指挥建造者干活的类。在这里,可以指定建造者的生产顺序。

    Product,最终生产出来的产品。不同的Builder应该会生产不同的Product.

    写到这里,突然发现,Builder就像是建筑工人,而Director就像是工头。不同场景下的工人,刷墙的方式不一样,但刷墙的顺序是一样的。这时,工头就可以根据不同的场景,比如精装修和简装的房子,指挥不同的工人进行刷墙,而最终工人刷出来的墙都是【刷过的墙】,但当然不一样(精装和简装)。

    3.来个例子

    将之前工厂模式的例子稍微修改一下,生产一整套的运动服。

     1 package com.khlin;
     2 
     3 public class App {
     4 
     5     public static void main(String[] args) {
     6         Builder builder = new ManUtdBuilder();
     7         Director director = new Director(builder);
     8         director.construct();
     9         SportSuit sportSuit = builder.getProduct();
    10         System.out.println(sportSuit.toString());
    11     }
    12 }
    13 
    14 class SportSuit {
    15     String jersey;
    16 
    17     String sneakers;
    18 
    19     String socks;
    20 
    21     public void setJersey(String jersey) {
    22         this.jersey = jersey;
    23     }
    24 
    25     public void setSneakers(String sneakers) {
    26         this.sneakers = sneakers;
    27     }
    28 
    29     public void setSocks(String socks) {
    30         this.socks = socks;
    31     }
    32 
    33     @Override
    34     public String toString() {
    35         return "I m wearing " + jersey + " and " + sneakers + " and " + socks;
    36     }
    37 }
    38 
    39 interface Builder {
    40 
    41     void buildJersey();
    42 
    43     void buildSneakers();
    44 
    45     void buildSocks();
    46 
    47     SportSuit getProduct();
    48 }
    49 
    50 class ManUtdBuilder implements Builder {
    51 
    52     // builder持有产品
    53     private SportSuit sportSuit = new SportSuit();
    54 
    55     @Override
    56     public void buildJersey() {
    57         this.sportSuit.setJersey("ManUtd Jersey");
    58     }
    59 
    60     @Override
    61     public void buildSneakers() {
    62         this.sportSuit.setSneakers("Adidas Sneakers");
    63     }
    64 
    65     @Override
    66     public void buildSocks() {
    67         this.sportSuit.setSocks("Adidas Socks");
    68         ;
    69     }
    70 
    71     @Override
    72     public SportSuit getProduct() {
    73         return this.sportSuit;
    74     }
    75 }
    76 
    77 class Director {
    78     Builder builder;
    79     
    80     public Director(Builder builder) {
    81         this.builder = builder;
    82     }
    83     
    84     public void construct() {
    85         //指定建造的顺序
    86         builder.buildJersey();
    87         builder.buildSneakers();
    88         builder.buildSocks();
    89     }
    90 }

     4. 建造者模式的变形

    实际上创建一个模型,可能有多个参数。

    参考:建造者模式的实践

  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/6012291.html
Copyright © 2020-2023  润新知