当前位置: 首页 > news >正文

初识设计模式(建造者模式)

前言:继续学习设计模式,今天学习建造者模式。

建造者模式(Builder Pattern)

定义

  又叫生成器模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

设计原则

  依赖倒转原则,抽象不应该依赖细节,细节应该依赖抽象。

目的

  如果我们用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。

什么时候使用

  主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的(产品对象具有共性),但对象内部的构建通常面临着复杂的变化。

好处

  使得建造者代码与表示代码分离,达到解耦。

  由于建造者隐藏了该产品是如何组装的,所以若要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了,符合“开闭原则”。

  将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,易于精确控制对象的创建。

缺点

  建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

结构图

基本代码

具体产品

package designpatterns.builder;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体产品
 * @author yule
 * @date 2018/8/12 13:32
 */
public class Product {
    private List<String> parts = new ArrayList<>();

    /**
     * 添加产品部件
     * @param part
     */
    public void addPart(String part){
        parts.add(part);
    }

    /**
     * 列举所有产品部件
     */
    public void show(){
        System.out.println("产品创建:");
        for(String part : parts){
            System.out.println(part);
        }
    }
}

创建抽象建造者,假设一个产品需要partA,partB组成

package designpatterns.builder;

/**
 * 抽象建造者
 * @author yule
 * @date 2018/8/12 13:36
 */
public abstract class Builder {
    public abstract void builderPartA();
    public abstract void builderPartB();

    public abstract Product getProduct();
}

创建具体建造者1

package designpatterns.builder;

/**
 * 具体建造者1
 * @author yule
 * @date 2018/8/12 13:37
 */
public class ConcreteBuilder1 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A1");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B1");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

创建具体建造者2

package designpatterns.builder;

/**
 * 具体建造者2
 * @author yule
 * @date 2018/8/12 13:39
 */
public class ConcreteBuilder2 extends Builder{

    private Product product = new Product();

    @Override
    public void builderPartA() {
        product.addPart("部件A2");
    }

    @Override
    public void builderPartB() {
        product.addPart("部件B2");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

创建指挥者,用来指挥创建过程

package designpatterns.builder;

/**
 * 指挥者,用来指挥创建过程
 * @author yule
 * @date 2018/8/12 13:40
 */
public class Director {
    public void Construct(Builder builder){
        builder.builderPartA();
        builder.builderPartB();
    }
}

客户端代码,客户不需要知道具体的建造过程

    public static void main(String[] args){
        Director director = new Director();

        Builder builder1 = new ConcreteBuilder1();
        director.Construct(builder1);
        Product product1 = builder1.getProduct();
        product1.show();

        Builder builder2 = new ConcreteBuilder2();
        director.Construct(builder2);
        Product product2 = builder2.getProduct();
        product2.show();
    }

 

转载于:https://www.cnblogs.com/yuxiaole/p/9462784.html

相关文章:

  • 支付系统整体架构
  • Sketch 介绍
  • 简单的自创线程池
  • python网络编程三次握手和四次挥手
  • javascript基础知识(4) 字符串
  • C语言讨论象棋将帅问题,代码短又美!
  • python存储json文件
  • 6.0 实现app登录
  • socket编程-tcp
  • 私钥、公钥和地址
  • mongo学习- 副本集配置(事故自动转移)
  • 关于函数的参数传递注意事项
  • POJ1125-Stockbroker Grapevine【Floyd】(模板题)
  • 燃烧我的卡路里
  • 自己搜罗了一些感觉蛮有意思的爬虫相关的网站
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Android单元测试 - 几个重要问题
  • angular2 简述
  • emacs初体验
  • java概述
  • jquery ajax学习笔记
  • MD5加密原理解析及OC版原理实现
  • Meteor的表单提交:Form
  • mysql常用命令汇总
  • PhantomJS 安装
  • PHP 7 修改了什么呢 -- 2
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • WePY 在小程序性能调优上做出的探究
  • 从PHP迁移至Golang - 基础篇
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何设计一个微型分布式架构?
  • 三栏布局总结
  • 详解NodeJs流之一
  • 再次简单明了总结flex布局,一看就懂...
  • 阿里云ACE认证之理解CDN技术
  • 仓管云——企业云erp功能有哪些?
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • ( 10 )MySQL中的外键
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C语言)球球大作战
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matlab)使用竞争神经网络实现数据聚类
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑马C++)L06 重载与继承
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)iOS字体
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】