C# 设计模式——建造者模式(builder)

827 阅读2分钟
建造者(Builder)模式:将一个复杂对象拆解成多个相对简单的部分,根据不同需要分别实现它们,
最后组成该复杂对象。

建造者模式和抽象工厂方法区别在于,前者核心是将一个复杂的对象拆解成一个小的部分然后由所有整体
组成一个复杂的对象提供给调用者。
而后者并没有拆的概念,将各个分部组合起来的不是一个单独存在的对象。

using System;
namespace CSspace
{
    // 你要装修一个家
    public class House { 
        private string Floor;
        private string Door;
        private string Wall;
        private string Window;
        private string Celling;
    // 1)如果直接使用构造方法构造生成实例的弊端:
    //      当实例不需要全部字段时候,为了满足各种情况,我们要写各种各样的构造器重载。         
    //      当实例的参数列表过长时,我们不仅要关注参数的先后问题还要考虑有没有遗漏参数,
    //一边看函数一边填参数,想想就不想写下去了。(手动狗头)。
    // 
    // 2) 如果使用 get;set;(javaBean的模式)的风险:
    //      每个字段或者属性的get;set是分步完成的,失去了连续性。
    //      这样多个字段之间的get;set;中间可能穿插一些操作,而这些操作有改变字段或属性的风险,
    //所谓夜长梦多,能一次性做完的事情不要拖。
    
    // 所以干脆构造器私有化。这活不给你干了,交给Builder,这个哥们连轴转,不摸鱼。
        private  House (Builder builder)
            this.Floor = builder.Floor;
            this.Door = builder.Door;
            this.Wall = builder.Wall;
            this.Window = builder.Window;
            this.Celling = builder.Celling;
        }
       public override string ToString()
        {
            return this.Door+"-"+this.Window+"-"+this.Wall+"-"+"-"+this.Floor+"-"+this.Celling;
        }

    //这里使用了内部类
  public class Builder
    {
        public string Door{get;set;}
        public string Floor{get;set;}
        public string Wall{get;set;}
        public string Window{get;set;}
        public string Celling{get;set;}
        public Builder(string door, string window){
                this.Door = door;
                this.Window = window;
                }
        // 每次建造部分都返回 Builder 这个地方设计的太巧妙了。为下面的链式调用做了铺垫。
        public  Builder  BuildDoor(string door){ this.Door = door; return this;}
        public  Builder  BuildWall(string wall){this.Wall = wall; return this;}
        public  Builder  BuildWindow(string window){this.Window = window; return this;}
        public  Builder  BuildFloor(string floor){this.Floor = floor; return this;}
        public  Builder  BuildCelling(string celling){this.Celling = celling; return this;}
         public House build(){
            return new House(this);
        }

    }

    }
     
     public class Test {
        public  static void Main(){
           // 链式调用 (精彩精彩)
           House house = new House.Builder("防盗门","铝合金窗")
           .BuildFloor("大理石地板")
           .BuildWall("刷大白")
           .BuildCelling("继承吊顶")
           .build();
          Console.WriteLine(house.ToString());
     
        } 
    }
   
}