博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式 详解
阅读量:4662 次
发布时间:2019-06-09

本文共 2532 字,大约阅读时间需要 8 分钟。

定义

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

创建类模式

角色

  • 建造者角色(Product):给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建;
  • 抽象建造者角色(ConcreteBuilder):实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。在创建过程完成后,提供产品的实例;
  • 导演角色(Director): 调用具体建造者来创建复杂对象的各个部分,在指导中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建;
  • 产品角色(Product): 要创建的复杂对象;

从网上找到的例图

enter image description here

enter image description here


适用场景

  • 创建一些复杂的对象的时候,这些内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化;
  • 要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时;

例子

比如建造房子这个产品,工头作为导演角色,只安排事情,而工人作为抽象建造者,其中工人又分为水电工,水泥工,钢筋工等等,每个角色都掌握相应的技能,是在做事情的,最后房子也是那些工人提供的;


实现代码

/** * Created by George on 16/6/27. *///产品function Product(){    this._partA = null;    this._partB = null;    this._partC = null;};Product.prototype.setPartA = function (part) {    this._partA = part;};Product.prototype.getPartA = function () {    return this._partA;};Product.prototype.setPartB = function (part) {    this._partB = part;};Product.prototype.getPartB = function () {    return this._partB;};Product.prototype.setPartC = function (part) {    this._partC = part;};Product.prototype.getPartC = function () {    return this._partC;};//抽象建造者function Builder(){    this.buildPartA = function () {    };    this.buildPartB = function () {            };    this.buildPartC = function () {            };};//具体建造者(这里没办法实现继承抽象建造者)function ConcreteBuilder(){    this.product = new Product();    this.buildPartA = function () {        this.product.setPartA("A");    };    this.buildPartB = function () {        this.product.setPartB("B");    };    this.buildPartC = function () {        this.product.setPartC("C");    };    this.getProduct = function () {        return this.product;    };};//导演角色function Director(){    this.concreteBuilder = new ConcreteBuilder();    this.Director = function (builder) {        this.concreteBuilder = builder;    };    this.setBuilder = function (builder) {        this.concreteBuilder = builder;    };    this.construct = function () {        this.concreteBuilder.buildPartA();        this.concreteBuilder.buildPartB();        this.concreteBuilder.buildPartC();        //要从建造者处获得        return this.concreteBuilder.getProduct();    };};var builder = new ConcreteBuilder();var director = new Director(builder);var product = director.construct();  //这样就获取到了建造好的产品console.log(product.getPartA() + "\t" + product.getPartB() + "\t" + product.getPartC());

运行结果

这里写图片描述

  • 其实,要注意的地方在于,导演不做具体事情,只是安排内容,而具体建造者才是做事情的,最后取产品也是从具体建造者那里取;

优缺点

  1. 使用建造者可以使客户端不必知道产品内部组成的细节。
  2. 具体的建造者之间是相互独立的,对系统的扩展有利;
  3. 由于具体的创建者是独立的,因此可以对创建过程逐步细化,而不对其他的模块产生任何的影响;

    注意的是

转载于:https://www.cnblogs.com/George1994/p/6037655.html

你可能感兴趣的文章
MeayunDB-高性能分布式内存数据库
查看>>
反射 模板赋值
查看>>
【读书】领导力的5个层次-认同
查看>>
Tomcat创建HTTPS访问,java访问https
查看>>
Matlab实现IIR数字滤波器设计
查看>>
java常见异常
查看>>
手动添加PopMenu出现的问题
查看>>
Linux 远程桌面 访问 WIndows
查看>>
SQLServer存储过程自制数据字典
查看>>
TCP的粘包问题
查看>>
树上有十只鸟,开枪打死一只,还剩几只?
查看>>
随机生成汉字(摘录保存的代码)
查看>>
敢于面对惨淡的人生
查看>>
【bzoj 1119】 [POI2009] SLO(置换群)
查看>>
leetcode[19]Remove Nth Node From End of List
查看>>
Spring 系列: Spring 框架简介
查看>>
DataTable转换成IList
查看>>
web开发的模式
查看>>
【深入ASP.NET原理系列】--Asp.Net Mvc和Asp.Net WebForm实际上共用一套ASP.NET请求管道...
查看>>
Windows下搭建PHP开发环境(Apache+PHP+MySQL)
查看>>