zoukankan      html  css  js  c++  java
  • 设计模式 | 建造者模式及应用

    1、建造者模式角色分析:

    建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

    建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

    角色Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

    ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

    Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

    Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

    2、建造者模式运用

    相信很多小伙伴都玩过吃鸡游戏吧,那么大家了解吃鸡场景的环境是怎么实现的吗?相信许多小伙伴都经历过吃鸡游戏的黑夜模式、白天、阴雨天这些场景。那么我们今天就分析下这些地图环境是如何实现的。

    简单的来说,地图会有晴天和阴天、黑夜之分,那么创建地图时就要根据晴天或者阴天来对地图上的场景,比如:天空,树,房子,和路面进行渲染,这个过程是一个固定的,每创建一个新地图都要执行这几个渲染,这是针对高级配置的电脑来说的。

    建造者模式-JAVA代码实现

    产品角色 Map

    /**
     * Created by sww_6 on 2019/4/8.
     * 吃鸡游戏地图-----Product(产品角色))
     */
    @Data
    public class Map {
      //天气
      private String weather;
      //房子
      private String house;
      //树木
      private String tree;
      //道路
      private String way;
    
    }
    

      具体建造者 CloudyBuild,SunBuild,分别建造阴天地图和晴天地图

    /**
     * Created by sww_6 on 2019/4/8.
     */
    public class CloudyBuild extends Build {
    
      public void buildWeather() {
        map.setWeather("下雨天");
      }
    
      public void buildHouse() {
      map.setHouse("房子颜色灰暗");
      }
    
      public void buildTree() {
       map.setTree("树的颜色是深绿色");
      }
    
      public void buildWay() {
        map.setWay("道路湿滑");
      }
    }
    

      

    /**
     * Created by sww_6 on 2019/4/8.
     */
    public class SunBuild extends Build {
    
      public void buildWeather() {
        map.setWeather("艳阳高照的大晴天");
      }
    
      public void buildHouse() {
       map.setHouse("房子玻璃再反光");
      }
    
      public void buildTree() {
       map.setTree("输的颜色位浅绿色");
      }
    
      public void buildWay() {
       map.setWay("路面干燥");
      }
    }
    

      指挥者 MapDirector,指挥构建过程.

    /**
     * Created by sww_6 on 2019/4/8.
     * 指挥者 MapDirector,指挥构建过程
     */
    public class MapDirector {
    
      public Map constract(Build build){
        Map map;
        build.buildWeather();
        build.buildHouse();
        build.buildTree();
        build.buildWay();
        map = build.createMap();
        return map;
      }
    }
    

      客户端测试

    /**
     * Created by sww_6 on 2019/4/8.
     * 指挥者 MapDirector,指挥构建过程
     */
    public class MapDirector {
    
      public Map constract(Build build){
        Map map;
        build.buildWeather();
        build.buildHouse();
        build.buildTree();
        build.buildWay();
        map = build.createMap();
        return map;
      }
    }
    

      输出:

    Map(weather=艳阳高照的大晴天, house=房子玻璃再反光, tree=输的颜色位浅绿色, way=路面干燥)

    适用场景

    需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
    需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
    对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
    隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    [整理]Win下好用的Markdown工具
    tcpip http socket
    [整理].net中的延迟初始化器
    [整理]ASP.NET WEB API 2学习
    [整理]ASP.NET MVC 5
    [转载]AngularJS 指令 用法
    [整理]HTML5 WebSocket
    [整理]CSS3 滤镜
    [整理]WebAPP开发的框架
    [整理]AngularJS移动端开发遇到的问题
  • 原文地址:https://www.cnblogs.com/shenwen/p/10672396.html
Copyright © 2011-2022 走看看