坦克大战-创建者模式实现

需求:坦克大战

创建两种坦克

坦克类型 射程 速度
b70 70米 时/70公里
b50 50米 时/70公里


 

类图

要点

就是导演(导演)类桥接不同的创建者,决定了生成的坦克是不同的。无聊什么坦克都有两个创建步骤,创建速度,创建射程。

和抽象工厂的差别:抽象工厂是通过桥接不同的坦克工厂(抽象),创建出一系列不同的坦克部件(速度,射程)。

然后在用这些部件创造出坦克来。

虽然这里是用两种模式实现了相同的机能,但是通常应该是将两种模式结合起来用的,抽象工厂创建部件,然后又创建者来组装。后期我会在做一些模式的中和运用的示例。

代码(c++实现)

java实现

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

class Function{
public:
    string mFunction;
    Function(string str){
        mFunction = str;
    }
    void exe(){
        cout<<mFunction<<"\n";
    }
};

//抽象层

class AbstractShot{
public:
    virtual void fun()=0;
};
class AbstractRun{
public:
    virtual void fun()=0;
};
class Tank{
public:
    AbstractShot* mPSort;
    AbstractRun* mPRun;
    virtual void fun(){
        mPSort->fun();
        mPRun->fun();
    }
};
class AbstractBuilder{
public:
    virtual void createShot(Tank& tank)=0;
    virtual void createRun(Tank& tank)=0;
};
//实施层
class B70Shot: public AbstractShot{
public:
    virtual void fun(){
        Function function("B70Shot:射程70");
        function.exe();
    }
};
class B50Shot: public AbstractShot{
public:
    virtual void fun(){
        Function function("B50Shot:射程50");
        function.exe();
    }
};
class B70Run: public AbstractRun{
public:
    virtual void fun(){
        Function function("B70Run:速度70");
        function.exe();
    }
};
class B50Run: public AbstractRun{
public:
    virtual void fun(){
        Function function("B50Run:速度50");
        function.exe();    
    }
};


class B70Builder:public AbstractBuilder{
public:
    virtual void createShot(Tank& tank){
        tank.mPSort = new B70Shot();
    }
    virtual void createRun(Tank& tank){
        tank.mPRun = new B50Run();
    }
};
class B50Builder:public AbstractBuilder{
public:
    virtual void createShot(Tank& tank){
        tank.mPSort = new B50Shot();
    }
    virtual void createRun(Tank& tank){
        tank.mPRun = new B50Run();
    }
};

class Direcctor{
public:
    AbstractBuilder& mBuilder;
    Direcctor(AbstractBuilder& b):mBuilder(b){    
    }
    Tank& construct(){
        Tank* tank = new Tank();
        mBuilder.createRun(*tank);
        mBuilder.createShot(*tank);
        return *tank;
    }
};
// 客户端
class Client{
public:
    static void main(){
        Direcctor d(*(new B70Builder()));
        Tank& t = d.construct();
        t.fun();
    }
};

//客户端调用
int main()
{
    Function function("建造者模式演示");
    function.exe();
    Client::main();

    //看代码不用考虑以下内容
    int cin_a;
    cin>>cin_a;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xie__jin__cheng/article/details/88712363