C++通过内部类实现Builder模式

在Java中有一个很好用的Builder模式实现方法。此处使用C++仿照Java的版本实现Builder模式。

在C++中内部类和外部类是没有直接关系的,不能通过内部类访问外部类的私有对象也不能通过外部类访问内部类的私有对象。所以此处使用friend关键字来增强内部类对于外部类的访问,主要是访问外部类的私有构造函数。代码如下:

#include <iostream>
#include <memory>
using namespace std;

class BuilderDemo
{
public:
    class Builder
    {
    public:
        int servingSize;
        int servings;

        Builder(int servingSize, int servings)
        :servingSize(servingSize),servings(servings)
        {
        }

        shared_ptr<BuilderDemo> build()
        {
            return shared_ptr<BuilderDemo>(new BuilderDemo(*this));
        }
    };

private:
    BuilderDemo(const Builder& builder)
    {
        servingSize = builder.servingSize;
        servings = builder.servings;
    }

    friend class Builder;

private:
    int servingSize;
    int servings;
};

int main()
{
    BuilderDemo::Builder builder(4, 43);
    shared_ptr<BuilderDemo> demo = builder.build();

}

此处省略了外部类的部分成员变量,一般情况当外部类的成员变量个数在4个以上的时候可以使用Builder模式。

时间: 2024-08-30 05:40:00

C++通过内部类实现Builder模式的相关文章

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有

Android Builder模式在开发中的应用

最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder(R.drawable.default_img) .crossFade() .into(mImageView); 同时在年初的时候,学习RXJava的时候,用链式编程很优雅. Observable .just( "1" , "2" ) .subscribeOn(Sche

Java设计模式--Java Builder模式

1.Java Builder模式主要是用一个内部类去实例化一个对象,避免一个类出现过多构造函数,而且构造函数如果出现默认参数的话,很容易出错. public Person(String name) Person(String name, int age) Person(String name, int age, boolean sex) 2.Android OkHttp框架中Request.Response类都使用了Java Builder模式. 3.下面举一个小例子: /** * @autho

Android 建造者(Builder)模式

关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Builder 模式的地方还是很多的. 使用时 大概如下: Notification noti = new Notification.Builder(context).build(); AlertDialog dialog = new AlertDialog.Builder(context).create

使用Builder模式进行美化代码

在很多情况下我们需要定义一个Class且里面有很多成员变量的时候通常我们的写法是 class Person { private String name; private int age; private int sex; private int high; private int face; private int weight; private int foot; public Person() {...} public Person(String name) {...} ... public

Builder模式(建造者模式)

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则. 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数, DoDoContact(String name); DoDoContact(String name, int age); DoDoContact(S

Joshua Bloch错了? ——适当改变你的Builder模式实现

注:这一系列都是小品文.它们偏重的并不是如何实现模式,而是一系列在模式实现,使用等众多方面绝对值得思考的问题.如果您仅仅希望知道一个模式该如何实现,那么整个系列都会让您失望.如果您希望更深入地了解各个模式的常用法,并对各个模式进行深入地思考,那么希望您能喜欢这一系列文章. 在昏黄的灯光下,我开始了晚间阅读.之所以有这个习惯的主要原因还是因为我的睡眠一直不是很好.所以我逐渐养成了在晚九点以后看一会儿技术书籍以辅助睡眠的习惯. 今天随手拿起的是Effective Java的英文第二版.说实话,由于已

【代码优化】构造器参数繁多时候,考虑使用builder模式

静态工厂和构造器有个共同的局限性:都不能很好的扩展到大量的可选参数. 1.对于多个可选参数的构造器,我们都习惯采用重叠构造器模式,比如一个参数的构造器调用2个参数的构造器,     2个参数的构造器调用3个参数的,以此类推. public class User{ private int id: private String name: private String age: private String sex: public User(int id){ this(id,null); } pub

builder模式-积木系列

代码高效的表达意图,是优秀代码的基本标准,所以在刚刚写代码的时候我们总是被教育方法的名字,变量字段的名字要尽可能表达出在程序中的含义. 在<重构和模式>中提到的creation,就是讲构造实例的方式封装变为可以表达含义的方法提供给客户端使用,从而保证了在阅读客户端代码时,可以清洗的明白代码在做什么,而不需要进入构造方法中看创建的逻辑. 创建的模式中有工厂方法 和 builder模式.无论用什么方式,我们想达到的目的就是讲构造过程和使用过程分离. builder类图: