zoukankan      html  css  js  c++  java
  • 建造者模式

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

    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. 建造者模式的变形

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

    参考:建造者模式的实践

  • 相关阅读:
    Perface(TCP/IP 协议族)
    CHAPTER 2 Database Environment
    Chapter 1 Introduction
    2. Instructions: Language of the computer (指令:计算机语言)
    sed命令
    磁盘配额
    外设,镜像
    磁盘及文件系统挂载
    网络客户端工具命令
    TCP协议
  • 原文地址:https://www.cnblogs.com/kingsleylam/p/6012291.html
Copyright © 2011-2022 走看看