zoukankan      html  css  js  c++  java
  • GOF23设计模式之建造者模式(builder)

    一、建造者模式概述

      建造者模式的本质:

        1.分离了对象子组件的单独构造(由Builder负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的过程复杂的情况下使用。

        2.由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。

    二、建造者模式

      1.创建飞船部件及飞船

     1 /**
     2  * 飞船
     3  * @author CL
     4  *
     5  */
     6 public class Airship {
     7     private Engine engine;    //发动机
     8     private OrbitalMouble orbitalMouble;    //轨道舱
     9     private EscapeTower escapeTower;    //逃逸塔
    10     
    11     public void launch() {
    12         System.out.println("发射!");
    13     }
    14     
    15     public Engine getEngine() {
    16         return engine;
    17     }
    18     public void setEngine(Engine engine) {
    19         this.engine = engine;
    20     }
    21     public OrbitalMouble getOrbitalMouble() {
    22         return orbitalMouble;
    23     }
    24     public void setOrbitalMouble(OrbitalMouble orbitalMouble) {
    25         this.orbitalMouble = orbitalMouble;
    26     }
    27     public EscapeTower getEscapeTower() {
    28         return escapeTower;
    29     }
    30     public void setEscapeTower(EscapeTower escapeTower) {
    31         this.escapeTower = escapeTower;
    32     }
    33     
    34 }
    35 
    36 /**
    37  * 发动机类 
    38  */
    39 class Engine {
    40     private String name;
    41 
    42     public Engine(String name) {
    43         this.name = name;
    44     }
    45 
    46     public String getName() {
    47         return name;
    48     }
    49 
    50     public void setName(String name) {
    51         this.name = name;
    52     }
    53     
    54 }
    55 
    56 /**
    57  * 轨道舱类
    58  */
    59 class OrbitalMouble {
    60     private String name;
    61 
    62     public OrbitalMouble(String name) {
    63         this.name = name;
    64     }
    65 
    66     public String getName() {
    67         return name;
    68     }
    69 
    70     public void setName(String name) {
    71         this.name = name;
    72     }
    73 }
    74 
    75 /**
    76  * 逃逸塔类
    77  */
    78 class EscapeTower {
    79     private String name;
    80 
    81     public EscapeTower(String name) {
    82         this.name = name;
    83     }
    84 
    85     public String getName() {
    86         return name;
    87     }
    88 
    89     public void setName(String name) {
    90         this.name = name;
    91     }
    92 }

      2.创建飞船的构建接口和装配接口

     1 /**
     2  * 飞船的构建者
     3  * @author CL
     4  *
     5  */
     6 public interface AirshipBuilder {
     7     /**
     8      * 构建发动机
     9      * @return
    10      */
    11     Engine builderEngine();
    12     /**
    13      * 构建轨道舱
    14      * @return
    15      */
    16     OrbitalMouble builderOrbitalMouble();
    17     /**
    18      * 构建逃逸塔
    19      * @return
    20      */
    21     EscapeTower builderEscapeTower();
    22 }
     1 /**
     2  * 飞船的装配者
     3  * @author CL
     4  *
     5  */
     6 public interface AirshipDirector {
     7     /**
     8      * 装配飞船
     9      * @return
    10      */
    11     Airship directorAirship();
    12 }

      3.创建构建接口和装配接口的实现类

     1 /**
     2  * XAAU牌飞船构建者的实现类
     3  * @author CL
     4  *
     5  */
     6 public class XAAUAirshipBuilder implements AirshipBuilder {
     7 
     8     public Engine builderEngine() {
     9         System.out.println("构建发动机");
    10         return new Engine("XAAU牌发动机");
    11     }
    12 
    13     public OrbitalMouble builderOrbitalMouble() {
    14         System.out.println("构建轨道舱");
    15         return new OrbitalMouble("XAAU牌轨道舱");
    16     }
    17 
    18     public EscapeTower builderEscapeTower() {
    19         System.out.println("构建逃逸塔");
    20         return new EscapeTower("XAAU牌逃逸塔");
    21     }
    22 
    23 }
     1 /**
     2  * XAAU牌飞船装配者的实现类
     3  * @author CL
     4  *
     5  */
     6 public class XAAUAirshipDirector implements AirshipDirector {
     7     
     8     private AirshipBuilder builder;
     9     
    10     public XAAUAirshipDirector(AirshipBuilder builder) {
    11         this.builder = builder;
    12     }
    13 
    14     public Airship directorAirship() {
    15         //构建飞船部件
    16         Engine e = builder.builderEngine();
    17         OrbitalMouble o = builder.builderOrbitalMouble();
    18         EscapeTower et = builder.builderEscapeTower();
    19         
    20         //装配成飞船对象
    21         Airship ship = new Airship();
    22         ship.setEngine(e);
    23         ship.setOrbitalMouble(o);
    24         ship.setEscapeTower(et);
    25         
    26         return ship;
    27     }
    28 
    29 }

      4.测试

     1 /**
     2  * 利用建造者模式创建XAAU牌飞船对象的实例
     3  * @author CL
     4  *
     5  */
     6 public class Client {
     7 
     8     public static void main(String[] args) {
     9         AirshipDirector director = new XAAUAirshipDirector(new XAAUAirshipBuilder());
    10         
    11         Airship ship = director.directorAirship();
    12         
    13         System.out.println(ship.getEngine().getName());
    14         System.out.println(ship.getOrbitalMouble().getName());
    15         System.out.println(ship.getEscapeTower().getName());
    16         
    17         ship.launch();
    18     }
    19 }

      控制台输出:

    构建发动机
    构建轨道舱
    构建逃逸塔
    XAAU牌发动机
    XAAU牌轨道舱
    XAAU牌逃逸塔
    发射!

    三、建造者模式常见应用场景

      (1)StringBuilder类中的append方法;

      (2)SQL中的PreparedStatement;

      (3)JDOM中,DomBuilder、SAXBuilder;

      (4)………………

  • 相关阅读:
    获取其他线程的数据用 queue, 多进程Q
    self: 限制并发量asyncio
    asyncio 中给running 的loop 动态添加 Future Task
    雾里看花之 Python Asyncio
    python协程之动态添加任务
    异步IO( asyncio) 协程
    加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
    scrapy 'fcntl' has no attribute 'F_GETFD
    sitemap index
    Django模板系统 运算
  • 原文地址:https://www.cnblogs.com/cao-lei/p/8145154.html
Copyright © 2011-2022 走看看