在c ++中有效的java builder成语等价?
这是自从阅读Effective Java以来我一直在使用的一个很好的习惯用法。 我一直试图找到一个C ++等价物或类似的东西,并没有运气。 GoF书中的传统建筑模式在我的案例中并不适用。 这是一个复杂的对象,有一个非常混乱的构造函数。 下面是Java的一个小实现。
class ComplicatedObject { private String field1; private String field2; private int field3; private ComplicatedObject(Builder builder) { this.field1 = builder.myField1; this.field2 = builder.myField2; this.field3 = builder.myField3; } public static class Builder { private String myField1 = "some default"; private String myField2 = "some other default"; private int myField3 = -1; public Builder() { } public Builder field1(String val) { this.myField1 = val; return this; } public Builder field2(String val) { this.myField2 = val; return this; } public Builder field3(int val) { this.myField3 = val; return this; } public ComplicatedObject build() { return new ComplicatedObject(this); } } public static void main(final String[] args) { //built like this ComplicatedObject obj = new ComplicatedObject.Builder().field1("blah").field2("lol").field3(4).build(); } }
它不仅可以适应C ++,而且习惯用法改编自 C ++。
我想我第一次听说这个成语是在Java出现之前。 IIRC Bjarne Stroustrup在C ++第2版中提到这一点,解释了为什么C ++不需要Smalltalk样式命名参数。
我的日期可能错了,但这在C ++中大约有15年的历史。
编辑:它似乎首先在C ++的设计和演变 (6.5.1)中描述,它被称为命名函数参数
#include #include using namespace std; class ComplicatedObject { public: class Builder { friend class ComplicatedObject; private: string myField1; private: string myField2; private: int myField3; public: Builder() : myField1("some default"), myField2 ("some other default"), myField3(-1) { } public: Builder& field1(const string& val) { myField1 = val; return *this; } public: Builder& field2(const string& val) { myField2 = val; return *this; } public: Builder& field3(int val) { myField3 = val; return *this; } public: ComplicatedObject build() { return ComplicatedObject(*this); } }; private: string field1; private: string field2; private: int field3; private: ComplicatedObject(const Builder& builder) :field1(builder.myField1), field2(builder.myField2), field3(builder.myField3) {} }; int main(int argc, char** argv) { if (argc < 4) { std::cout << "not enough params."; return 1; } ComplicatedObject obj(ComplicatedObject::Builder().field1("blah").field2("lol").field3(4)); }
我做了很少的改动,使它成为C ++,快速,安全。 http://ideone.com/sCH1V
- Java中的’import’与C / C ++中的’#include’
- n个数字排成一个圆圈。 我们需要找到连续nos的最大总和
- 与Garbage Collector和finalize()方法相关的问题
- inheritanceJava集合接口(Set,Map,List等)的C ++等价物是什么? 或者扩展AbstractCollection?
- C性能和编译选项
- LatinIME dicttool用于V401二进制字典
- char类型可以归类为整数吗?
- 使用SWIG将Java Map 传递给C ++方法
- java中PKCS#5 PBKDF1的算法名称是什么? 什么是java中的CryptoPP :: PKCS5_PBKDF1的替代品?