建造者模式(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,如需转载请自行联系原作者









相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin在Android开发中的普及,了解其与Java在性能方面的差异变得尤为重要。本文通过深入分析和对比两种语言的运行效率、启动时间、内存消耗等关键指标,揭示了Kotlin在实际项目中可能带来的性能影响,并提供了针对性的优化建议。
30 0
|
1月前
|
安全 Java Android开发
构建高效安卓应用:探究Kotlin与Java的性能对比
【2月更文挑战第22天】 在移动开发的世界中,性能优化一直是开发者们追求的关键目标。随着Kotlin在安卓开发中的普及,许多团队面临是否采用Kotlin替代Java的决策。本文将深入探讨Kotlin和Java在安卓平台上的性能差异,通过实证分析和基准测试,揭示两种语言在编译效率、运行时性能以及内存占用方面的表现。我们还将讨论Kotlin的一些高级特性如何为性能优化提供新的可能性。
64 0
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第24天】 在移动开发领域,性能优化一直是开发者关注的重点。随着Kotlin的兴起,许多Android开发者开始从传统的Java转向Kotlin进行应用开发。本文将深入探讨Kotlin与Java在Android平台上的性能表现,通过对比分析两者在编译效率、运行时性能和内存消耗等方面的差异。我们将基于实际案例研究,为开发者提供选择合适开发语言的数据支持,并分享一些提升应用性能的最佳实践。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第22天】随着Kotlin在Android开发中的普及,开发者们对其性能表现持续关注。本文通过深入分析Kotlin与Java在Android平台上的执行效率,揭示了二者在编译优化、运行时性能以及内存占用方面的差异。通过实际案例测试,为开发者提供选择合适编程语言的参考依据。
|
11天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【2月更文挑战第28天】 在Android开发领域,Kotlin作为一种现代编程语言,逐渐取代了传统的Java语言。本文通过深入分析Kotlin和Java在Android平台上的性能差异,揭示两者在编译效率、运行速度以及内存消耗等方面的比较结果。我们将探讨Kotlin协程如何优化异步编程,以及Kotlin Extensions对提升开发效率的贡献。同时,文中还将介绍一些性能优化的实践技巧,帮助开发者在Kotlin环境下构建更加高效的Android应用。
|
1月前
|
安全 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第27天】 在Android开发领域,Kotlin和Java一直是热门的编程语言选择。尽管两者都可以用于创建高质量的Android应用程序,但它们在性能方面的差异一直是开发者关注的焦点。本文通过深入分析Kotlin与Java在Android平台上的运行效率、编译时间及内存消耗等方面的表现,揭示两种语言在实际应用中的性能差异,帮助开发者根据项目需求做出更明智的选择。