建造者模式(Builder)

     建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

模式结构

建造者模式(Builder)


 

建造者模式的好处:

      建造者模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们用了建造者模式,那么用户就只需要建造的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。


何时使用建造者模式?

       主要是用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构件通常面临着复杂的变化。


示例

    某年,*电视台举办的春节联欢晚会上的一个小品,有这样一个情节:宋丹丹给赵本山出个题儿--如何把大象装到冰箱里,赵本山没答上。宋丹丹告诉赵本山标准答案:第一步把冰箱门打开,第二步把大象放进去,第三步把冰箱门关上。


    建造者模式(Builder)


  同理,我们可以按照这个步骤,向冰箱里装其他东西:比如,过期的牛奶,吃剩的Pizza,甚至还可以模仿俄罗斯套娃,装个冰箱(冰箱的使用详见冰箱使用手册,I bet 冰箱绝对不是这样用的。。)。。下面来看一下装大象的代码:

  

namespace 把大象装冰箱
{
    /*首先抽象出一个建造过程的类,将把“东西装在冰箱”
     * 这个过程给稳定住。就是说,不管向冰箱里面装什么东西
     * 都得按照这个步骤来,一步都不能丢。*/
    abstract class PutIntoFridge
    {
       
        public abstract void OpenFridge();
        public abstract void PutInto();
        public abstract void CloseFridge();
 
    }

    /*写一个把大象装冰箱的类,然后让这个类去继承PutIntoFridge
     * 在这个类里面,给出如何把大象装冰箱的具体实现。*/
    class PutElephantIntoFri : PutIntoFridge
    {
        private string name;

        public PutElephantIntoFri(string name)
        {
            this.name = name;
        }

        public override void OpenFridge()
        {
            Console.WriteLine("打开了冰箱门~~");

        }

        public override void PutInto()
        {
            Console.WriteLine("把 {0} 装进冰箱。", name);
            
        }

        public override void CloseFridge()
        {
            Console.WriteLine("把冰箱门关上了。");
        }
 
    }


    /*指挥者:用来指挥把东西装冰箱这个过程,用它来隔离用户与
     * 建造过程的关联。*/
    class Director
    {
        private PutIntoFridge pif;

        //构造的时候指明要实现把什么东西装冰箱
        public Director(PutIntoFridge pif)
        {
            this.pif = pif;
        }

        /*写一个把大象装冰箱的过程,用以隐藏具体的把大象装冰箱的过程
         * 使用时只需调用这一个方法就行。*/
        public void CreatePutIntoFif()
        {
            pif.OpenFridge();
            pif.PutInto();
            pif.CloseFridge();
        }
 
    }


    class Program
    {
        static void Main(string[] args)
        {
            PutElephantIntoFri peif = new PutElephantIntoFri("小象");
            Director director = new Director(peif);

            director.CreatePutIntoFif();

            Console.WriteLine(" ");


        }
    }
}

最后,运行一下,装冰箱成功。。。


建造者模式(Builder)


  


上一篇:面试官备份知识点


下一篇:使用traefik作为istio流量入口,并在traefik上实现流量控制