设计模式之美(c++)-笔记-46-建造者模式

Posted 欢乐的企鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之美(c++)-笔记-46-建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式的原理和实现比较简单,重点是掌握应用场景,避免过度使用

如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合 set() 方法来解决。但是,如果存在下面情况中的任意一种,我们就要考虑使用建造者模式了

我们把类的必填属性放到构造函数中,强制创建对象的时候就设置。如果必填的属性有很多,把这些必填属性都放到构造函数中设置,那构造函数就又会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些必填属性是否已经填写的逻辑就无处安放了

如果类的属性之间有一定的依赖关系或者约束条件,我们继续使用构造函数配合 set() 方法的设计思路,那这些依赖关系或约束条件的校验逻辑就无处安放了。

如果我们希望创建不可变对象,也就是说,对象在创建好之后,就不能再修改内部的属性值,要实现这个功能,我们就不能在类中暴露 set() 方法。构造函数配合 set() 方法来设置属性值的方式就不适用了。

除此之外,在今天的讲解中,我们还对比了工厂模式和建造者模式的区别。工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,“定制化”地创建不同的对象

struct IllegalArgumentException
{
	IllegalArgumentException(string msg) { cout << msg << endl; }
};

class ResourcePoolConfig {

	//...省略getter方法...
public:
	//我们将Builder类设计成了ResourcePoolConfig的内部类。
	//我们也可以将Builder类设计成独立的非内部类ResourcePoolConfigBuilder。
	class Builder {
	private:
		static const int DEFAULT_MAX_TOTAL = 8;
		static const int DEFAULT_MAX_IDLE = 8;
		static const int DEFAULT_MIN_IDLE = 0;
		string name;
		int maxTotal = DEFAULT_MAX_TOTAL;
		int maxIdle = DEFAULT_MAX_IDLE;
		int minIdle = DEFAULT_MIN_IDLE;
		friend class ResourcePoolConfig;

	public:
		ResourcePoolConfig* build() {
			// 校验逻辑放到这里来做,包括必填项校验、依赖关系校验、约束条件校验等
			if (name.empty()) {
				throw IllegalArgumentException("...");
			}
			if (maxIdle > maxTotal) {
				throw IllegalArgumentException("...");
			}
			if (minIdle > maxTotal || minIdle > maxIdle) {
				throw IllegalArgumentException("...");
			}
			return new ResourcePoolConfig(*this);
		}

		Builder& setName(string name) {
			if (name.empty()) {
				throw IllegalArgumentException("...");
			}
			this->name = name;
			return *this;
		}

		Builder& setMaxTotal(int maxTotal) {
			if (maxTotal <= 0) {
				throw IllegalArgumentException("...");
			}
			this->maxTotal = maxTotal;
			return *this;
		}

		Builder& setMaxIdle(int maxIdle) {
			if (maxIdle < 0) {
				throw IllegalArgumentException("...");
			}
			this->maxIdle = maxIdle;
			return *this;
		}

		Builder& setMinIdle(int minIdle) {
			if (minIdle < 0) {
				throw IllegalArgumentException("...");
			}
			this->minIdle = minIdle;
			return *this;
		}
	};

private:
	ResourcePoolConfig(Builder builder) {
		name = builder.name;
		maxTotal = builder.maxTotal;
		maxIdle = builder.maxIdle;
		minIdle = builder.minIdle;
	}

private:
	string name;
	int maxTotal;
	int maxIdle;
	int minIdle;
};

int main()
{
	ResourcePoolConfig* config = ResourcePoolConfig::Builder()
		.setName("dbconnectionpool")
		.setMaxTotal(16)
		.setMaxIdle(10)
		.setMinIdle(8)
		.build();
    
    //delete config;//注意使用完之后释放内存
	return 0;
}

 

以上是关于设计模式之美(c++)-笔记-46-建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式:学习笔记——建造者模式

设计模式——11.建造者模式

设计模式--建造者模式C++实现

设计模式之建造者模式

设计模式学习笔记建造者模式和其他对象创建方式的区别

C# 设计模式巩固笔记 - 建造者模式