设计模式深入学习-Builder生成器(创建型模式 )

来源:互联网 发布:抓包软件下载 编辑:程序博客网 时间:2024/05/18 03:20
   假如我们在创建游戏中的一个房屋House设施,该房屋肯定会有好几个部分组成,而且各个部分都会经常发生改变。比如窗,门等设施需求经常发生变化,但房屋整体不变。比如换个屋顶,但我们整个房子其他东西不变。如果我们使用最直观的设计方法,那么每一个房屋部分的变化,都会导致房屋构建的重新修正。 在我们的创建程序的工作中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成,由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。
   那么我们应该如何应付这样的变化,怎么样提供一种封装机制来隔离出 "复杂对象的各个部分"的变化,而使我们的系统稳定构建算法不随着需求改变而改变。

   Builder创造型设计模式的动机就是应对这样的需求变化而产生的。 将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。那么我们来看代码的实现:

public abstract class House    {             }    public abstract class Door { }    public abstract class Wall { }    public abstract class Windows { }    public abstract class Floor { }    public abstract class HouseCeiling { }      public abstract class Builder    {        public abstract void BuildDoor();        public abstract void BuildWall();        public abstract void BuildWindows();        public abstract void BuildFloor();        public abstract void BuildHouseCeiling();        public abstract House GetHouse();      }

我们构造一些抽象的基本方法,定下来一个房屋有门,墙,窗,地板,天花板,然后还有一个抽象的House的构造方法。然后我们在定义一个实现类 GameManager:
public class GameManager   {       public static House CreateHouse(Builder builder)       {           builder.BuildDoor();           builder.BuildDoor();            builder.BuildWindows();           builder.BuildWindows();            builder.BuildWall();           builder.BuildWall();           builder.BuildWall();           builder.BuildWall();            builder.BuildFloor();           builder.BuildHouseCeiling();           return  builder.GetHouse();       }   }

   我们创造了一个房子,有2个门,2个窗户,4个墙,一个地板和天花板,然后返回数据。 但是这都仅仅是一些抽象的实现,现在我们来写一些具体的实现。

public class ModelHouseBuilder:Builder   {       public override void BuildDoor() { }       public override void BuildWall() { }        public override void BuildWindows() { }        public override void BuildFloor() { }        public override void BuildHouseCeiling() { }         public override House GetHouse()      {          return new ModelHouse();      }    }    public class ModelHouse : House   {            }    public class modelDoor : Door {}    public class modelWindows : Windows { }    public class modelFloor : Floor { }    public class modelHouseCeiling : HouseCeiling { }

   我们现在创建了一个现代房子,所有现代房子的代码都在这里面完成。最后,我们来实现整个现代房屋 :

class Program   {       static void Main(string[] args)       {           House house = GameManager.CreateHouse(new ModelHouseBuilder());        }   }

   目前我们可以看到Builder设计模式的一个过程了,在构造的过程中,这一个阶段是稳定的。比如实现房屋的抽象类,GameManager类,这些都是稳定的。但是在上面具体的实现类中是不稳定的,我们需要经常改动,那么这就是使用Builder设计模式的好处所在,构造不稳定,构造过程稳定。这样我们的客户实现类就可以随时替换房屋类而不影响我们的整体效果实现。
   我们再来回顾下Builder设计模式的几个要点: 
   Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
   变化点在哪里,封装哪里--Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应付“分步骤构建算法”的需求变动。
    AbstractFactory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。
    Builder模式通常和Composite模式组合使用。
0 0
原创粉丝点击