建造者模式(Java与Kotlin版)

简介:

. 定义

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

 

2. 结构

Product:产品角色;

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

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

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

 

3. 代码

3.1 Java

Product:

 1 class Product { 2     private String name; 3     private int price; 4  5     public void setName(String name_arg) { 6         name = name_arg; 7     } 8  9     public void setPrice(int price_arg) {10         price = price_arg;11     }12 13     public void show() {14         System.out.println("名字: " + name + ", 价格: " + price);15     }16 }

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

Director:

 1 class Director { 2     AbstractBuilder builder; 3  4     public void setBuilder(AbstractBuilder builder_arg) { 5         builder = builder_arg; 6     } 7  8     public Product construct() { 9         builder.buildName();10         builder.buildPrice();11 12         return builder.getProduct();13     }14 }

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

AbstractBuilder:

1 abstract class AbstractBuilder {2     abstract public void buildName();3     abstract public void buildPrice();4     abstract public Product getProduct();5 }

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

ConcreteBuilder1与ConcreteBuilder2:

 1 class ConcreteBuilder1 extends AbstractBuilder { 2     private Product product; 3  4     public ConcreteBuilder1() { 5         product = new Product(); 6     } 7  8     public void buildName() { 9         product.setName("套餐1");10     }11 12     public void buildPrice() {13         product.setPrice(1);14     }15 16     public Product getProduct() {17         return product;18     }19 }

 1 class ConcreteBuilder2 extends AbstractBuilder { 2     private Product product; 3  4     public ConcreteBuilder2() { 5         product = new Product(); 6     } 7  8     public void buildName() { 9         product.setName("套餐2");10     }11 12     public void buildPrice() {13         product.setPrice(2);14     }15 16     public Product getProduct() {17         return product;18     }19 }

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

测试代码:

 1 public class BuilderPattern { 2     public static void main(String[] args) { 3         System.out.println("Builder Pattern"); 4  5         Product product; 6  7         Director director = new Director(); 8  9         AbstractBuilder builder1 = new ConcreteBuilder1();10         director.setBuilder(builder1);11         product = director.construct();12         product.show();13 14         AbstractBuilder builder2 = new ConcreteBuilder2();15         director.setBuilder(builder2);16         product = director.construct();17         product.show();18     }19 }

输出:

 

 

3.2 Kotlin

Product:

 1 class Product { 2     private var name: String? = null 3     private var price: Int = 0 4  5     fun setName(name_arg : String) { 6         name = name_arg 7     } 8  9     fun setPrice(price_arg : Int) {10         price = price_arg11     }12 13     fun show() {14         println("名字: $name, 价格: $price")15     }16 }

Director:

 1 class Director { 2     private var builder: AbstractBuilder? = null 3  4     fun setBuilder(builder_arg: AbstractBuilder) { 5         builder = builder_arg 6     } 7  8     fun construct(): Product { 9         builder?.buildName()10         builder?.buildPrice()11 12         return builder!!.getProduct()13     }14 }

AbstractBuilder:

1 abstract class AbstractBuilder {2     abstract fun buildName()3     abstract fun buildPrice()4     abstract fun getProduct(): Product5 }

ConcreteBuilder1与ConcreteBuilder2:

 1 class ConcreteBuilder1 : AbstractBuilder() { 2     private val product: Product 3  4     init { 5         product = Product() 6     } 7  8     override fun buildName() { 9         product.setName("套餐1")10     }11 12     override fun buildPrice() {13         product.setPrice(1)14     }15 16     override fun getProduct(): Product {17         return product18     }19 }

 1 class ConcreteBuilder2 : AbstractBuilder() { 2     private val product: Product 3  4     init { 5         product = Product() 6     } 7  8     override fun buildName() { 9         product.setName("套餐2")10     }11 12     override fun buildPrice() {13         product.setPrice(2)14     }15 16     override fun getProduct(): Product {17         return product18     }19 }

测试代码:

 1 fun main(array: Array<String>) { 2     println("Builder Pattern") 3  4     var product: Product? = null 5  6     val director = Director() 7  8     val builder1 = ConcreteBuilder1() 9     director.setBuilder(builder1)10     product = director.construct()11     product.show()12 13     val builder2 = ConcreteBuilder2()14     director.setBuilder(builder2)15     product = director.construct()16     product.show()17 }

输出同上。

 

4. 优缺点

4.1 优点

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

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

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

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

 

4.2 缺点

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

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

 

5. 适用场景

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

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

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

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




      本文转自zsdnr  51CTO博客,原文链接:http://blog.51cto.com/12942149/1949754,如需转载请自行联系原作者









相关文章
|
8天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【5月更文挑战第4天】在移动开发的世界中,性能一直是衡量应用质量的重要指标。随着Kotlin的兴起,许多Android开发者开始考虑是否应该从传统的Java迁移到Kotlin。本文通过深入分析两者在Android平台上的性能差异,帮助开发者理解Kotlin在实际项目中的表现,并提供选择编程语言时的参考依据。
21 5
|
11天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
11天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
15天前
|
Java 测试技术 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【4月更文挑战第26天】 在移动开发领域,性能优化一直是开发者追求的重要目标。随着Kotlin的兴起,其在Android平台上的应用逐渐增多,但关于Kotlin与Java在性能方面的对比,社区中仍存在诸多讨论。本文通过实际的性能测试,分析比较了使用Kotlin和Java编写的Android应用在多个维度上的运行效率,旨在为开发者提供一个明确的性能参考,帮助他们在选择编程语言时做出更加明智的决策。
|
17天前
|
Java 编译器 Android开发
构建高效Android应用:Kotlin与Java的性能比较
【4月更文挑战第25天】 在移动开发领域,性能优化始终是开发者关注的焦点。随着Kotlin的普及,许多Android开发者开始考虑是否应该采用这种新的编程语言来替代传统的Java。本文通过对Kotlin和Java进行深入的性能比较,揭示了两者在Android开发中的效率差异,并提供了选择合适语言以提升应用性能的策略。通过实际案例分析和基准测试,我们探讨了两种语言在编译速度、运行时性能以及内存消耗等方面的表现,旨在为开发者提供一个关于如何在Android项目中做出明智语言选择的指南。
32 0
|
18天前
|
Java Kotlin
[AIGC] Java 和 Kotlin 的区别
[AIGC] Java 和 Kotlin 的区别
|
18天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin与Java的性能比较
【4月更文挑战第24天】在移动开发领域,性能优化始终是关键议题之一。随着Kotlin的普及,许多Android开发者开始考虑将其作为首选语言。本文深入分析了Kotlin与Java在Android平台上的性能差异,并通过实际案例演示了Kotlin的优化策略。我们将探讨如何通过智能语言特性和现代编程实践来提升应用效率,同时保持代码的可读性和可维护性。
|
19天前
|
Java C++ Kotlin
进制转换在C/C++/Java/Kotlin中的应用(详细版)(下)
进制转换在C/C++/Java/Kotlin中的应用(详细版)
11 1
|
19天前
|
存储 人工智能 Java
进制转换在C/C++/Java/Kotlin中的应用(详细版)(上)
进制转换在C/C++/Java/Kotlin中的应用(详细版)
8 0
|
28天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。