前文推送

设计模式

简单工厂模式(Java与Kotlin版)

工厂方法模式(Java与Kotlin版)

抽象工厂模式(Java与Kotlin版)

Kotlin基础知识

Kotlin入门第一课:从对比Java开始

Kotlin入门第二课:集合操作

Kotlin入门第三课:数据类型

初次尝试用Kotlin实现Android项目

1. 定义

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

2. 结构

Product:产品角色;

Director:指挥者,利用具体建造者创建产品;

AbstractBuilder:抽象建造者,定义抽象的建造方法;

ConcreteBuilder:具体建造者,实现建造方法;

3. 代码

3.1 Java

Product:

 class Product {
     private String name;
     private int price;

     public void setName(String name_arg) {
         name = name_arg;
     }

     public void setPrice(int price_arg) {
         price = price_arg;
     }

     public void show() {
         System.out.println("名字: " + name + ", 价格: " + price);
     }
 }

除了两个属性的set方法,还定义了一个打印属性的show方法。

Director:

 class Director {
     AbstractBuilder builder;

     public void setBuilder(AbstractBuilder builder_arg) {
         builder = builder_arg;
     }

     public Product construct() {
         builder.buildName();
         builder.buildPrice();

         return builder.getProduct();
     }
 }

通过设置的建造者,创建产品实例并返回。

AbstractBuilder:

 abstract class AbstractBuilder {
     abstract public void buildName();
     abstract public void buildPrice();
     abstract public Product getProduct();
 }

定义了三个抽象方法,用于设置产品属性及获取实例。

ConcreteBuilder1与ConcreteBuilder2:

 class ConcreteBuilder1 extends AbstractBuilder {
     private Product product;

     public ConcreteBuilder1() {
         product = new Product();
     }

     public void buildName() {
         product.setName("套餐1");
     }

     public void buildPrice() {
         product.setPrice();
     }

     public Product getProduct() {
         return product;
     }
 }
 class ConcreteBuilder2 extends AbstractBuilder {
     private Product product;

     public ConcreteBuilder2() {
         product = new Product();
     }

     public void buildName() {
         product.setName("套餐2");
     }

     public void buildPrice() {
         product.setPrice();
     }

     public Product getProduct() {
         return product;
     }
 }

具体建造者,实现产品的创建。

输出:

3.2 Kotlin

Product:

 class Product {
     private var name: String? = null

     fun setName(name_arg : String) {
         name = name_arg
     }

     fun setPrice(price_arg : Int) {
         price = price_arg
     }

     fun show() {
         println("名字: $name, 价格: $price")
     }
 }

Director:

 class Director {
     private var builder: AbstractBuilder? = null

     fun setBuilder(builder_arg: AbstractBuilder) {
         builder = builder_arg
     }

     fun construct(): Product {
         builder?.buildName()
         builder?.buildPrice()

         return builder!!.getProduct()
     }
 }

AbstractBuilder:

 abstract class AbstractBuilder {
     abstract fun buildName()
     abstract fun buildPrice()
     abstract fun getProduct(): Product
 }

ConcreteBuilder1与ConcreteBuilder2:

 class ConcreteBuilder1 : AbstractBuilder() {
     private val product: Product

     init {
         product = Product()
     }

     override fun buildName() {
         product.setName("套餐1")
     }

     override fun buildPrice() {
         product.setPrice()
     }

     override fun getProduct(): Product {
         return product
     }
 }
 class ConcreteBuilder2 : AbstractBuilder() {
     private val product: Product

     init {
         product = Product()
     }

     override fun buildName() {
         product.setName("套餐2")
     }

     override fun buildPrice() {
         product.setPrice()
     }

     override fun getProduct(): Product {
         return product
     }
 }

输出同上。

4. 优缺点

4.1 优点

在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;

每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 ;

可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程;

增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

4.2 缺点

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

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

5. 适用场景

需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;

需要生成的产品对象的属性相互依赖,需要指定其生成顺序;

对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中;

隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

建造者模式(Java与Kotlin版)的更多相关文章

  1. 工厂方法模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次 ...

  2. 抽象工厂模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...

  3. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  4. 简单工厂模式(Java与Kotlin版)

    Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...

  5. BuilderPattern(建造者模式)-----Java/.Net

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

  6. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  7. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  8. Effective Java —— 多字段下考虑使用建造者模式构建实例

    本文参考 本篇文章参考自<Effective Java>第三版第二条"Consider a builder when faced with many constructor pa ...

  9. Java设计模式-建造者模式(Builder)

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...

随机推荐

  1. Customer segmentation – LifeCycle Grids with R(转)

    I want to share a very powerful approach for customer segmentation in this post. It is based on cust ...

  2. Shiny for Interactive Application Development using R(转)

    This slidify-based deck introduces the shiny package from R-Studio and walks one through the develop ...

  3. mysql之 binlog维护详细解析(开启、binlog相关参数作用、mysqlbinlog解读、binlog删除)

    binary log 作用:主要实现三个重要的功能:用于复制,用于恢复,用于审计.binary log 相关参数:log_bin设置此参数表示启用binlog功能,并指定路径名称log_bin_ind ...

  4. LAMP的搭建与简易配置(apache,php已module方式结合)

    测试所用环境:centos7.2 apache php 所在主机IP:9.110.187.120 mariadb 所在主机IP:9.110.187.121 第一部分:环境搭建 yum安装软件包 其中a ...

  5. 自研框架wap.js实践

    示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心  方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法.   ...

  6. 对于php内存释放问题

    大家在使用PhpExcel类时,当打开一个比较大的excel数据文档,会出现Fatalerror: Allowed memorysize of 67108864 bytes exhausted (tr ...

  7. Unable to find 'struts.multipart.saveDir' property setting.

    今天在项目开发中遇到如下问题 项目使用的是struts2 Unable to find 'struts.multipart.saveDir' property setting. 后来在网上查询特此记录 ...

  8. Python 的枚举 Enum

    枚举是常用的功能,看看Python的枚举. from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May' ...

  9. js中替换字符串(replace方法最简单的应用)

    replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也 ...

  10. javascript中 __proto__与prorotype的理解

    我们先看看这样一段代码: <script type="text/javascript"> var Person = function () { }; var p = n ...