设计模式在游戏中的应用--建造者模式(九)

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。通过这个定义,我们可以得出建造者是一种创建型模式,也就是说建造者模式的输出是一个对象,也就是UML类图中的product。

我们先看看建造者模式的UML类图:

UML类图中我们可以看出,建造者模式使用了聚合、继承和依赖三种关系。第一个疑问就是为什么要使用聚合,如果我们不使用聚合的话,我们始终得到的都是稳定的构建过程,例如我们游戏中每个NPC都有2只手,当我们想要我们游戏在某些场合NPC都是一只手的时候,我们需要对每个ConcreteBuilder中添加生成一只手的逻辑,非常地冗余。

第二个疑问就是我们为什么使用继承,这个问题比较好回答,因为通过这次的基础我们可以让每个继承之Builder的子类都需要实现Builder中定义的纯虚函数,防止某些ConcreteBuilder忘记了写某些函数导致缺胳膊缺腿的情况。

最后一个疑问自然也就是为什么使用依赖,其实这个也比较好回答,因为我们要生成一个product。同时我们通过这个依赖关系能够得出,建造者模式是在product的基础之上进行封装,也就是说我们不喜欢改变product的东西而是调用porduct的方法。

游戏中会有各种log,而log往往都有公共的库,我们使用这些log的时候不希望改变log的内部结构,仅仅是使用这种log提供的各种方法。log可以分为各种类型,例如调试信息、错误信息、警告信息和自定义信息等。我们希望在Windows下面每种log的颜色不一样,方便我们查看,在linux下面每种log的颜色一样等。

代码如下图:

// MVC.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

class Log
{
public:
    Log():m_color(0),m_size(0),m_isWriteFile(false){};
    void SetSize(int size)
    {
        m_size = size;
    }

    void SetColor(int color)
    {
        m_color = color;
    }

    void WriteFile( bool value )
    {
        m_isWriteFile = value;
    }

    void PrintInfo()
    {
        cout<<"m_color:"<<m_color<<endl<<"m_size:"<<m_size<<endl<<"m_isWriteFile"<<m_isWriteFile<<endl;
        cout<<"----------------------------"<<endl;
    }
private:
    int  m_color;
    int  m_size;
    bool m_isWriteFile;
};

class ILogBuider
{
public:
    ILogBuider(){};
    virtual ~ILogBuider(){};
    virtual void SetColor() =  0;
    virtual void SetSize() = 0;
    virtual void WriteFile() = 0;
};

class DLogBuiler:public ILogBuider
{
public:
    DLogBuiler()
    :m_product(new Log())
    {}
    void SetSize()
    {
        m_product->SetSize(1);
    }
    void SetColor()
    {
        m_product->SetColor(1);
    }
    void WriteFile()
    {
        m_product->WriteFile(true);
    }
    Log* GetLog()
    {
        return m_product.get();
    }
private:
    auto_ptr<Log> m_product;
};

class ELogBuiler:public ILogBuider
{
public:
    ELogBuiler()
    :m_product(new Log())
    {}
    void SetSize()
    {
        m_product->SetSize(2);
    }
    void SetColor()
    {
        m_product->SetColor(2);
    }
    void WriteFile()
    {
        m_product->WriteFile(true);
    }
    Log* GetLog()
    {
        return m_product.get();
    }
private:
    auto_ptr<Log> m_product;
};

class WDirector
{
public:
    WDirector(){};
    void Construct(ILogBuider* builder)
    {
        builder->SetColor();
        builder->SetSize();
        builder->WriteFile();
    }
};

class LDirector
{
public:
    LDirector(){};
    void Construct(ILogBuider* builder)
    {
        builder->SetSize();
        builder->WriteFile();
    }
};

void main()
{
    //windows;
    cout<<"------------Windows-----------------"<<endl;
    auto_ptr<WDirector> wDirector(new WDirector());
    auto_ptr<LDirector> lDirector(new LDirector());
    auto_ptr<DLogBuiler>dBuilder(new DLogBuiler());
    auto_ptr<ELogBuiler>eBuilder(new ELogBuiler());

    wDirector->Construct(dBuilder.get());
    wDirector->Construct(eBuilder.get());

    dBuilder->GetLog()->PrintInfo();
    eBuilder->GetLog()->PrintInfo();

    //linux
    cout<<"------------Linux-----------------"<<endl;
    dBuilder.reset(new DLogBuiler());
    eBuilder.reset(new ELogBuiler());

    lDirector->Construct(dBuilder.get());
    lDirector->Construct(eBuilder.get());

    dBuilder->GetLog()->PrintInfo();
    eBuilder->GetLog()->PrintInfo();
}

建造者模式属于一种创建型的模式,主要是对product进行封装从而能适应不同的情况,同时product内部有着稳定的创建过程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 06:17:12

设计模式在游戏中的应用--建造者模式(九)的相关文章

设计模式在游戏中的应用--外观模式(八)

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用.外观模式相当于KFC里面的套餐,大多数人去FKC吃中饭,本质其实就是为了填饱肚子,消费者需要主食.饮料和小吃,有了各种套餐之后,消费者去KFC可以选择各种套餐就能满足自己的需要,不至于由于自己不会点餐都点主食而造成口渴和难以下咽的情况.套餐可以满足大多数人的需求. MMORPG游戏中也有着一些外观模式的应用,例如游戏中一种套餐可以让玩家升级到满级,学习和装备了最高的技能和装备.

设计模式在游戏中的应用--原型模式(六)

Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建. 上面是原型模式的UML结构图. 下面是原型模式的代码: #include "stdafx.h" #include <iostream> #include <string> using namespace s

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

设计模式在游戏中的应用--观察者模式(十)

观察者模式看似很陌生,其实可以说观察者模式是游戏中使用最多的一种模式,甚至比单例模式还要使用频繁,而且想要写好游戏的代码必须了解游戏中的那些地方使用了观察者模式,每个观察者的订阅者是谁. 大多数MMORPG游戏主体就是一个while循环,通过这些while循环来更新订阅者,从而来更新观察者.例如我们有个玩家的订阅者,每个玩家就是一个观察者,我只需要更新订阅者来更新每个观察者.我们每个玩家身上有很多的buff,我们玩家就是订阅者,每个buff就是观察者,这样玩家获得更新的时候,我们身上的每个buf

Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象. 该模式适用于构建较为复杂的对象(多个子组件). 不同的构建者,使用相同的装配者,可以建造不同的对象实例.相同的构建者,不同的装配顺序,也可能建造出不同的对象实例. 举例: 汽车对象,子组件包括引擎.轮子和车体. Audi汽车构建者,负责制造Audi牌各个子组件.BMW汽车构建者,负责制造BMW牌各个子组件.然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车. 以下

设计模式(十六):建造者模式

一.概述 建造者模式很容易让人想到建房子,不管建刚需房.改善房还是别墅,它们都离不开地基.柱子.层面和墙体这些组成部分,建筑工人就是把这些组成部分一个个建起来,最后连成一体建出一栋栋楼房. 来看看建造者模式的定义,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建房子的过程都是相似的,但可以建出形形色色的房子. 二.结构类图 三.应用实例 我们用制造自行车为例子讲解建造者模式,自行车由车架.轮胎.脚踏等部件组成,如下图所示.自行车制造公司就是把这些零部件组装起来. 自行

设计模式在游戏中的应用--模板方法(七)

模板方法这个名字看着很陌生,其实在游戏中大量地使用了模板方法,因为游戏中存在玩家.NPC和静态物体等不同的对象,使用多态特性能很好地进行区分. 模板方法的定义是:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. 举个最简单的玩家和NPC死亡时的逻辑: 流程图如下: 代码如下 // MVC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include

js架构设计模式——理解javascript中的MVVM开发模式

理解javascript中的MVVM开发模式 http://blog.csdn.net/slalx/article/details/7856769 MVVM的全称是Model View ViewModel,这种架构模式最初是由微软的MartinFowler作为微软软件的展现层设计模式的规范提出,它是MVC模式的衍生物,MVVM模式的关注点在能够支持事件驱动的UI开发平台,例如HTML5,[2][3] WindowsPresentation Foundation (WPF), Silverligh

设计模式(五)Builder Pattern建造者模式

在我们日常生活中,如构建一个飞船,一个手机,一栋建筑,都会有非常复杂的组装,这时候应该用到建造者模式 以建造一个飞船为例 案例:造小页飞船 1.飞船各部分元件 package com.littlepage.BuilderPattern; public interface AirShipBuilder { Engine builderEngine(); OrbitalModule builderOrbitalModule(); Escape builderEscape(); } 2.飞船实体用来组