建造模式

前言

最近在写一个功能考虑到不同配置去自动调整渲染,以适应不同机型或者是让用户自己去选择高,中,低的渲染。然后考虑到使用工厂模式还是去建造模式去实现这个功能,所以这里记录一下它们的区别。

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.游戏人物的连击动作效果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值