当前:创建者
需求:坦克大战
价值:控制一系列产品的创建步骤。让一系列函数相关。从需求的角度来将,这也起到了将需求分类的作用。
创建两种坦克
坦克类型 | 射程 | 速度 |
b70 | 70米 | 时/70公里 |
b50 | 50米 | 时/70公里 |
类图
要点
就是导演(导演)类桥接不同的创建者,决定了生成的坦克是不同的。无聊什么坦克都有两个创建步骤,创建速度,创建射程。
和抽象工厂的差别:抽象工厂是通过桥接不同的坦克工厂(抽象),创建出一系列不同的坦克部件(速度,射程)。
然后在用这些部件创造出坦克来。
虽然这里是用两种模式实现了相同的机能,但是通常应该是将两种模式结合起来用的,抽象工厂创建部件,然后又创建者来组装。后期我会在做一些模式的综合运用的示例。
代码(c++实现)
#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;
}