[Kotlin设计模式笔记] 构建器模式Builder


简介

构造器和构建者模式

严格意义上的构建者模式(GOF书中的)是分为产品、抽象建造者、具体建造者、指挥者四个元素的。但小型应用的时候不会这么麻烦,所以本文的"构建者模式"大体上是指"在成员私有的情况下让用户自由组装对象"

形象理解构建者模式

构建者模式的实现方法多种多样,但都有一个目的:让使用者可以自由组建对象。以买手抓饼类比的话,工厂模式就是只有"鸡柳+土豆","生菜+土豆"这两种套餐可选,而构建者模式是可以在"土豆,生菜,鸡柳,火腿"都可以加,选择权交给使用者自由组合

Kotlin构建者模式

Kotlin是不怎么需要构建者模式的。一个优秀的(应用型)编程语言往往会自然而然地写出健壮的代码。可以用Kotlin的几个语法特性轻松的实现

"不"实现

Kotlin可以直接通过变量名自由构建对象,这也是某些文章中的"Kotlin无需构建者模式"的理有

class Product(private var prop0: String = "", private var prop1: String = "")

val p = Product(
	prop0 = "OK",
	prop1 = "Hello"
)

匿名成员函数实现

class Product(private var prop0: String = "", private var prop1: String = "") {
    companion object {
        inline fun buildProduct(builder: Product.()->Unit) :Product {
            val r = Product()
            r.builder()
            return r
        }
    }
}


Kotlin的"Function literals with receiver"语法可以将"语境"给予函数,从而轻松达到构建者模式的功能,我们只需在伴随对象中创建一个构建函数,它接收具有Product的"语境"的构造器builder即可实现

apply函数实现

另外,Kotlin内置了apply函数,完成了上述功能,所以甚至可以直接不写任何代码,使用的时候直接调用即可

class Product(private var prop0: String = "", private var prop1: String = "")

var p = Product().apply {
	prop0 = "Hello"
	prop1 = "Ok"
}

设计模式本身就是一种最佳实践准则,是从实践经验中总结出来的常用技巧。Kotlin作为一门新的工程语言,总结了设计模式中的经验,让人能更易写出符合最佳实践的代码。

经典构建者模式: C++

待补充

在C++中,常使用一个叫做方法链的技巧来实现构建者模式

#include 
using namespace std;

class Product {
private:
		int    prop0;
		string prop1;
	public:
		Product() {
			cout << "product created" << endl;
		}
		Product& setProp0(int value) 
		{
			prop0 = value;
			return *this;
		}
		Product& setProp1(string value) 
		{
			prop1 = value;
			return *this;
		}
		
		friend ostream& operator<<(ostream& out, Product& self)
		{
			out << self.prop0 << "," << self.prop1;
			return out;
		}
};


int main() {
	Product p = Product()
		.setProp0(5)
		.setProp1("Ok");
	
	cout << p << endl;
	
	return 0;
}