设计模式的C++实现之建造者模式

解决的问题:

我创建的这个对象比较复杂,且该对象里面的成员函数用不同的实现来表示不同的实例,换句话说 就是同样的对象构建过程可以有不同的表示。比如我那天去吃过桥米线,他们有不同的套餐,套餐里包含的种类是一样的, 都有一碗米线,一份凉菜,一杯饮料。但是不同的套餐里这3样又都不是全部一样的。此时我们就可以用建造者模式。

类图结构:

1.建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应 用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口 所要求的方法:一个是建造方法,另一个是结果返还方法。此时就是米线店的员工,按照收银员的要求的去准备具体的套餐 ,放入适当的米线,凉菜和饮料。

2.具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相 关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:实现Builder角色提供的接口,一步一步完 成创建产品实例的过程。在建造过程完成后,提供产品的实例。是具体的做某个套餐的员工。

3.指导者(Director )角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体 知识的是具体建造者对象。是收银员,他知道我想要什么套餐,他会告诉里面的米线店员工去准备什么套餐。

4.产 品(Product)角色:产品便是建造中的复杂对象。指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的 请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为 客户端所知。就是最后的套餐,所有东西放到一起端过来。

样例实现:

// CplusplusBuild.cpp : 

Defines the entry point for the console application.
//  

#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
using namespace std;
//product
class Food
{
private:<strong>
    </strong>vector<string> mFoodName;
    vector<int> mFoodPrice;  

public:
    void add(string foodName,int price)
    {
        mFoodName.push_back(foodName);
        mFoodPrice.push_back(price);
    }  

    void show()
    {
        cout<<"Food List" <<endl;
        cout<<"-------------------"<<endl;
        for(int i=0;i<mFoodName.size();i++)
        {
            cout<<mFoodName[i]<<" "<<mFoodPrice[i]<<endl;
        }
    }
};  

//builder
class Builder
{
public:
    virtual void BuildRiceNoodles() {};
    virtual void BuildCoolDish(){};
    virtual void BuildDrink(){};
    virtual Food * getFood(){return NULL;}
};  

//builderA
class BuilderA:public Builder
{
private:
    Food *food;  

public:
    BuilderA(){food = new Food();}
    void BuildRiceNoodles()
    {
        food->add("RiceNoodlesA",20);
    }
    void BuildCoolDish()
    {
        food->add("CoolDishA",20);
    }
    void BuildDrink()
    {
        food->add("DrinkA",20);
    }
    Food * getFood()
    {
        return food;
    }
};  

//builderB
class BuilderB:public Builder
{
private:
    Food *food;
public:
    BuilderB(){food = new Food();}
    void BuildRiceNoodles()
    {
        food->add("RiceNoodlesB",10);
    }
    void BuildCoolDish()
    {
        food->add("CoolDishB",10);
    }
    void BuildDrink()
    {
        food->add("DrinkB",10);
    }
    Food * getFood()
    {
        return food;
    }
};  

//director
class FoodManager
{
public:
    void Construct(Builder * builder)
    {
        builder->BuildRiceNoodles();
        builder->BuildDrink();
        builder->BuildCoolDish();
    }
};  

//clent
int _tmain(int argc, _TCHAR* argv[])
{
    FoodManager *foodManager= new FoodManager();  

    Builder * builder = new Builder();  

    // the following code can use simple factory;
    char ch;
    cout<<"input your food Type (A or B):";
    cin>>ch;
    if(ch=='A')
    {
        builder = new BuilderA();
    }else if(ch=='B')
    {
        builder = new BuilderB();
    }  

    foodManager->Construct(builder);
    Food * food = builder->getFood();
    food->show();
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 产品
, 实例
, 接口
, c++ push_back
, 角色
, 具体实现
, 拓路者
, 建造者模式
, 不同
, android建造者模式
建造者设计模式
设计模式c 实现、c语言实现设计模式、设计模式 建造者模式、设计建造模式、c 建造者模式,以便于您获取更多的相关知识。

时间: 2024-11-08 17:25:20

设计模式的C++实现之建造者模式的相关文章

Ruby设计模式编程中使用Builder建造者模式的实例_ruby专题

先来复习一下设计模式的基本概念:定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要重新定一个建造者就可以了.实用范围1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2.当构造过程必须允许被构造的对象有不同表示时.角色在这样的设计模式中,有以下几个角色: 1.builder:为创建一个产品对象的各个部件指定抽象接口. 2.ConcreteBuilder:实现Builder

.NET设计模式(4):建造者模式(Builder Pattern)

概述 在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种"封装机制"来隔离出"复杂对象的各个部分"的变化,从而保持系统中的"稳定构建算法"不随着需求改变而改变?这就是要说的建造者模式. 意图 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的

深入理解JavaScript系列(27):设计模式之建造者模式详解

 这篇文章主要介绍了深入理解JavaScript系列(27):设计模式之建造者模式详解,建造者模式可以将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,需要的朋友可以参考下     介绍 在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定.如何应对这种变化?如何提供一种"封装机制"来隔离出"复

Java运用设计模式中的建造者模式构建项目的实例解析_java

1.建造者模式概念定义: 将一个复杂的对象构建与其表示相分离,使得同样的构建过程可以创建不同的表示: 核心 : 构建与表示分离,同构建不同表示 区别于 抽象工厂模式 : (1)与抽象工厂模式 相似,因为它也可以创建复杂对象.主要的区别是建造者模式着重于 一步步构造一个复杂对象,关注的是零件类型和装配工艺的顺序 .而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的).建造者模式在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的. (2)在建造者模式里,有个指导者,由指导者来管理建造者

设计模式(三)建造者模式Builder(创建型)

设计模式(三)建造者模Builder(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述        在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定.        例子1:买肯德基        典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡.炸鸡.可乐和玩具

全面解析设计模式中的建造者模式及相关C++实现_C 语言

生活中有着很多的建造者的例子,个人觉得大学生活就是一个建造者模式的最好体验: 要完成大学教育,一般将大学教育过程分成 4 个学期进行,因此没有学习可以看作是构建完整大学教育的一个部分构建过程,每个人经过这 4 年的(4 个阶段)构建过程得到的最后的结果不一样,因为可能在四个阶段的构建中引入了很多的参数(每个人的机会和际遇不完全相同). 建造者模式要解决的也正是这样的问题:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来,

详解C++设计模式编程中建造者模式的实现_C 语言

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这是建造者模式的标准表达,不过看着让人迷惑,什么叫构建和表示的分离?一个对象使用构造函数构造之后不就固定了,只有通过它方法来改变它的属性吗?而且还要同样的构建过程搞出不同的表示,怎么可能呢?多写几个构造函数? 其实多写几个构造函数,根据不同参数设置对象不同的属性,也可以达到这样的效果,只是这样就非常麻烦了,每次要增加一种表示就要添加一个构造函数,将来构造函数会多得连自己都不记得了,这违背了开放-封闭的原则. 要

C#设计模式(5)——建造者模式(Builder Pattern)

原文:C#设计模式(5)--建造者模式(Builder Pattern) 一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还

设计模式:建造者模式(Builder)

 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.  建造者模式通常包括下几个角色: 1. builder(抽象建造者):给出一个抽象结论,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建. 2. ConcreteBuilder(具体建造者):实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建.在构造过程完成后,提供产品的实例. 3. Director(指导者):调用具体建