zoukankan      html  css  js  c++  java
  • 设计模式学习--Builder

    What

    Builder:将一个复杂的对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。

    Why

    Builder也是创建型模式的一种,它是一步一步的向导式的创建一个复杂的对象,Builder接口定义创建复杂对象的零部件,Director根据客户端端传入的builder按照一定的步骤创建完成复杂对象的创建。
    Builder适用于比较复杂的对象的创建,该对象的创建有比较稳定的步骤或者比较稳定的“零件”,但是“零件”(步骤)内部的构建是复杂多变的。
    设计模式书中Builder适用于如下情况:
    1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    2、当构造过程必须允许被构造的对象有不同的表示时。

    How

    假设如下场景,需要构造一个汽车类,汽车有轮子,方向盘,发动机,不同品牌的汽车零件算法不同。以此为示例,使用builder模式实现。
    汽车builder接口

    public abstract class CarBuilder {
    
        protected Car car=null;
    
        public abstract void buildWheel();
    
        public abstract void buildEngine();
    
        public abstract void buildSteeringWheel();
    
        public Car getResult(){
            return car;
        }
    }
    

    Jeep汽车builder实现

    public class JeepCarBuilder extends CarBuilder {
    
        @Override
        public void buildWheel() {
            System.out.println("construct jeep car wheel");
        }
    
        @Override
        public void buildEngine() {
            System.out.println("construct jeep car engine");
        }
    
        @Override
        public void buildSteeringWheel() {
            System.out.println("construct jeep car steering wheel");
        }
    }
    

    Chery汽车builder实现

    public class CheryCarBuilder extends CarBuilder {
    
        @Override
        public void buildWheel() {
            System.out.println("construct chery car wheel");
        }
    
        @Override
        public void buildEngine() {
            System.out.println("construct chery car engine");
        }
    
        @Override
        public void buildSteeringWheel() {
            System.out.println("construct chery steering wheel");
        }
    }
    

    Director实现

    public class CarDirector {
    
        private CarBuilder builder;
    
        public CarDirector(CarBuilder builder){
            this.builder=builder;
        }
    
        public Car construct(){
            builder.buildSteeringWheel();
            builder.buildEngine();
            builder.buildWheel();
            return builder.getResult();
        }
    }
    

    Client调用

    public class App {
    
        public static void main( String[] args ){
    
            CarBuilder builder=new JeepCarBuilder();
            CarDirector director=new CarDirector(builder);
            director.construct();
    
            CarBuilder builder1=new CheryCarBuilder();
            CarDirector director1=new CarDirector(builder1);
            director1.construct();
        }
    }
    

    本示例类图如下:


    Discuss

    Builder模式的好处是使建造代码与表示代码分离,如果需要增加系列产品,只需要增加相应的builder接口实现即可,如果需要改变产品的表示,也只需修改builder接口的实现即可。
    在jdk中,StringBuilder是一个简易版的builder模式,其中StringBuilder充当了builder以及construct的角色,Client充当了Director。
    类图如下(来自happyhippy's Blog):

    Reference

    1、Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?

  • 相关阅读:
    Cocos2d-js官方完整项目教程翻译:六、添加Chipmunk物理引擎在我们的游戏世界里
    linux coreseek-4.1安装
    8个必备的PHP功能开发
    LINUX 下mysql导出数据、表结构
    PHP缩略图类
    PHP文件上传类
    PHP抓取页面的几种方式
    MySQL性能优化的最佳20+条经验
    zend studio9.0.3破解及汉化 windons版
    【转载】【面试经验】PHP中级面试题
  • 原文地址:https://www.cnblogs.com/JerryWang1991/p/3936381.html
Copyright © 2011-2022 走看看