前言
最近在写一个功能考虑到不同配置去自动调整渲染,以适应不同机型或者是让用户自己去选择高,中,低的渲染。然后考虑到使用工厂模式还是去建造模式去实现这个功能,所以这里记录一下它们的区别。
1.构建游戏渲染对象
房屋建造的抽象类,具体代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace BuilderPattern
{
public abstract class BaseBuilder
{
public abstract void BuildDoor();
public abstract void BuildWall();
public abstract void BuildWindows();
public abstract void BuildFloor();
public abstract void BuildHouseStyle();
public abstract BaseBuilder GetHouse();
}
}
中国样式的房屋类,代码如下:
using System;
namespace BuilderPattern
{
public class ChineseHouse : BaseBuilder
{
public ChineseHouse home = null;
public ChineseHouse() {
if (home == null)
home = this;
}
public override void BuildDoor()
{
Console.WriteLine("中国样式的门");
}
public override void BuildFloor()
{
Console.WriteLine("中国样式的地板");
}
public override void BuildHouseStyle()
{
Console.WriteLine("中国样式的布局");
}
public override void BuildWall()
{
Console.WriteLine("中国样式的墙");
}
public override void BuildWindows()
{
Console.WriteLine("中国样式的窗");
}
public override BaseBuilder GetHouse()
{
return home;
}
}
}
欧美样式的房屋类,代码如下:
using System;
namespace BuilderPattern
{
public class EuramericanHouse : BaseBuilder
{
public EuramericanHouse home = null;
public EuramericanHouse() {
if (home == null)
home = this;
}
public override void BuildDoor()
{
Console.WriteLine("欧美样式的门");
}
public override void BuildFloor()
{
Console.WriteLine("欧美样式的地板");
}
public override void BuildHouseStyle()
{
Console.WriteLine("欧美样式的布局");
}
public override void BuildWall()
{
Console.WriteLine("欧美样式的墙");
}
public override void BuildWindows()
{
Console.WriteLine("欧美样式的窗");
}
public override BaseBuilder GetHouse()
{
return home;
}
}
}
具体去做渲染的类, 这个类就先随便定义几个渲染模式吧!高精度渲染,去掉门的渲染,去掉地板的渲染等等,这个类在建造者模式称为建造者类,具体代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace BuilderPattern
{
public class Director
{
public enum RenderingType:byte
{
ALL = 0b11111,
Remove_Door = 0b11110,
Remove_Floor = 0b11101,
Remove_Floor_Door = 0b11100,
Only_Frame = 0b00100,
}
public void Construct(BaseBuilder builder, RenderingType renderingType = RenderingType.ALL) //高精度创建
{
if((byte)renderingType % 2 != 0)
builder.BuildDoor();
if (((byte)renderingType >> 1) % 2 != 0)
builder.BuildFloor();
if (((byte)renderingType >> 2) % 2 != 0)
builder.BuildHouseStyle();
if (((byte)renderingType >> 3) % 2 != 0)
builder.BuildWall();
if (((byte)renderingType >> 4) % 2 != 0)
builder.BuildWindows();
}
}
}
建造者类相当于一些接口组合成其他高级接口,主要是对方法过程的细腻化。我们可以考虑如果不使用建造者模式,这样创建过程将会暴露在Main函数下,而且如果需要游戏切换渲染方式的时候会比较麻烦,但是经过建造者模式设计之下,渲染的等级可以很多,比如我们在低配电脑下只要把Only_Frame枚举值传递进去创建出来的模型单单是房屋外型(没有任何的细节,比如没有门的细节,地板的细节),当我们在高配电脑下就可以使用ALL枚举值,使其渲染效果全开,模型更加的细腻。当然!当然!,这里还有游戏优化的一个手段,就是当你的人物离这些房屋比较远的时候就调用比较差的渲染参数,当你的人物里的比较近时就调高渲染参数,这个在游戏里面的技术叫做LOD。
总结
1.工厂模式和建造者模式区别
比如以上情况使用工厂模式去修改渲染等级可以吗?回答是当然可以,比如按照参数返回低等级渲染对象,中等级渲染对象,高等级渲染对象,然后拿着这个类实例去渲染游戏,但是这样子做了以后,你会发现不够灵活,因为渲染手段在对象中已经写死了,比如我想加一个中低等级渲染对象,这样又要写大量的代码,但是使用以上的建造者模式,只需要添加一个枚举值即可。每个模式都有自己的适用场景,工厂模式注重的是整体对象的创建方法,而建造者模式注重的是对象的调用过程和组合,创建对象的过程方法可以在创建时自由调用。
2.建造者模式的优缺点
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。
3.建造者模式的使用场景
1.游戏不同等级的渲染效果
2.游戏人物的连击动作效果